使用游标更新Temp表中的记录

1996年

我正在尝试创建一个游标,该游标将第一条记录插入到临时表中。之后,它应获取下一条记录,并将employeeId + date(格式为05/05/2014)与上一条记录的employeeId + date进行比较。如果相同,则应使用当前记录的超时数据更新前一个记录的超时数据。否则,应插入新行。

I have table in my database with the following columns:
 employeeID(int), employeeName varchar(max), Time datetime.
     1          ,   Tim                    , 05/05/2014 08:15:42
     1          ,   Tim                    , 05/05/2014 16:30:51
     1          ,   Tim                    , 06/23/2014 07:00:00
     1          ,   Tim                    , 06/23/2014 09:00:00
     1          ,   Tim                    , 06/23/2014 11:00:00
     1          ,   Tim                    , 06/23/2014 16:30:00

我用以下几列创建了一个临时表,最终结果应类似于以下信息。

employeeID, employeeName ,  Time in            ,    Time out
 1          ,   Tim   , 05/05/2014 08:15:42 ,    05/05/2014 16:30:51
 1          ,   Tim   , 06/23/2014 07:00:00      06/23/2014 16:30:00

下面是我的代码

    Drop Table #temp
 go
 Create Table #temp 
 (
userid int,
empname varchar(50),
checkin datetime,
checkout datetime
 )


 Declare @empid int, @empname varchar(50), @date1 datetime, @strdate varchar(12);
 Declare @date2 datetime, @time datetime, @loop int;


 Declare Report Cursor
For select e.employeeId,e.name,tp.TimePunch, tp.TimePunch as date2,
    CONVERT(VARCHAR(10),TimePunch,110) as stringDate
    from EmpTimePunch tp
    left join EmploeeInfo e on tp.employeeId = tp.employeeId
    where (DATEDIFF(s,'2014-05-01 00:00:00.000',TimePunch) >=0 
    and DATEDIFF(s,getdate(),TimePunch)<=0)
    order by employeeId,TimePunch

Open Report 
-- looking at each record 
Fetch Next From Report
    Into @empid, @empname, @date1, @date2,@strdate

declare @empDate varchar(50);
declare @empDate2 varchar(50);
set @empDate = '';
set @empDate2 = '';
set @loop = 0
--0 equals true; while fetching equal true 
while @@FETCH_STATUS = 0

    Begin
    -- insert first record in temp table
        if @loop != 0 and @empDate = @empDate2
            insert into #temp values(@empid, @empname, @date1, @date2)

            --I want to compare the next record
            -- if next record have same employee id and date2(05/05/2014) as prievous record.
            --update previous record date2 with the date2 from record 2
            set @empDate = cast(@empid as varchar(10))+ @strdate;

        fetch next from report
            Into @empid, @empname, @date1, @date2,@strdate

    End
close Report
Deallocate Report

select * from #temp
马克

根据经验,在SQL中应避免使用迭代逻辑。只要有可能,就应利用语言的声明性-将您的代码表示为基于集合的查询。

我提出类似或类似的解决方案;

;WITH MyData (employeeID, employeeName, [Time])  
AS
(
    SELECT 1, 'Tim', '05/05/2014 08:15:42' UNION ALL
    SELECT 1, 'Tim', '05/05/2014 16:30:51' UNION ALL
    SELECT 1, 'Tim', '06/23/2014 07:00:00' UNION ALL
    SELECT 1, 'Tim', '06/23/2014 09:00:00' UNION ALL
    SELECT 1, 'Tim', '06/23/2014 11:00:00' UNION ALL
    SELECT 1, 'Tim', '06/23/2014 16:30:00'
)
SELECT   employeeID
        ,employeeName
        ,[Time In]  = MIN([Time])
        ,[Time Out] = MAX([Time])
FROM MyData
GROUP BY employeeID, employeeName, CAST([Time] AS DATE)

如果您不熟悉CTEs或不满意s;

CREATE TABLE #MyData
(
    employeeID      INT, 
    employeeName    VARCHAR(50),    --  Please use VARCHAR(MAX) as infrequently as possible 
    ClockTime       DATETIME        --  In this example, I've changed the field name from [Time] to ClockTime           
)                                   --  It is best to avoide reserved words for object\field naming

INSERT INTO #MyData (employeeID, employeeName, ClockTime)
    SELECT 1, 'Tim', '05/05/2014 08:15:42' UNION ALL
    SELECT 1, 'Tim', '05/05/2014 16:30:51' UNION ALL
    SELECT 1, 'Tim', '06/23/2014 07:00:00' UNION ALL
    SELECT 1, 'Tim', '06/23/2014 09:00:00' UNION ALL
    SELECT 1, 'Tim', '06/23/2014 11:00:00' UNION ALL
    SELECT 1, 'Tim', '06/23/2014 16:30:00'

SELECT   employeeID
        ,employeeName
        ,[Time In]  = MIN(ClockTime)
        ,[Time Out] = MAX(ClockTime)
FROM #MyData
GROUP BY employeeID, employeeName, CAST(ClockTime AS DATE)

脚注; 我确信当我建议CURSORS您在SQL中学习的最后一件事时,我的观点会得到回应希望这将“迫使”您尝试基于集合的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

计算表中的记录并使用游标更新表

来自分类Dev

无法使用oracle中的游标在表中插入记录

来自分类Dev

在plsql中使用游标更新多个记录

来自分类Dev

使用某些条件更新表中的记录

来自分类Dev

使用游标和变量更新表

来自分类Dev

表名称为参数的游标的更新记录

来自分类Dev

表名称为参数的游标的更新记录

来自分类Dev

如何在游标循环内使用批量收集将表类型对象中的记录追加

来自分类Dev

PostgreSQL游标更新表

来自分类Dev

更新Access表中的记录

来自分类Dev

如何更新表中的记录?

来自分类Dev

更新游标中的多个表不起作用

来自分类Dev

使用组中的记录排名更新MySQL表

来自分类Dev

无法使用Servlet和JSP更新表中的特定记录

来自分类Dev

使用MERGE语句将记录更新/插入到表中

来自分类Dev

更新游标中的多行

来自分类Dev

使用游标更新

来自分类Dev

生成XML并在不使用游标的情况下在sql Server中的表中更新它

来自分类Dev

使用其他表中的值的总和更新sql表中的记录

来自分类Dev

在表中找不到给定记录时如何处理游标中的异常

来自分类Dev

使用游标进行分页时更新ndb中的实体

来自分类Dev

如何使用游标从多个表中获取信息?

来自分类Dev

使用游标将相同的值插入到表中

来自分类Dev

通过使用引用表SQL Server更新表中的多个记录

来自分类Dev

更新计数> 1的表中的记录

来自分类Dev

从CTE结果更新表中的记录

来自分类Dev

更新表中不存在的记录

来自分类Dev

更新计数> 1的表中的记录

来自分类Dev

更新链接表中的记录