1

如果我有一个像这样的表变量,如何循环这个变量来进行一些处理:

DECLARE @userData TABLE(
                                    userId int NOT NULL,
                                    dayDate datetime NOT NULL,
                                    transIn datetime NULL,
                                    transOut datetime NULL,
                                    attIn datetime NULL,
                                    attOut datetime NULL,
                                    MissionIn datetime NOT NULL,
                                    MissionOut datetime NOT NULL,
                                    empState varchar(10) NULL
                                   );


                INSERT INTO @userData
                SELECT userid, trans_date,transtime_in,transtime_out,att_start_time,att_end_time,@Mission_fromdatetime,@Mission_todatetime,day_flag
                FROM datatable_o a
                WHERE a.userid = @userid AND a.trans_date = @date ORDER BY  transtime_in ;

根据评论整个案例:

如果工作开始于 :att_start_time结束于att_end_time(work period]

每个员工都可以在同一日期多次入住和退房,以便我们跟踪他。签入存储在transtime_in 和签出存储在transtime_out

我有day_flag,所以我可以知道这一天是“W”工作日还是“E”周末

现在考虑所有这些信息,除了emp_num ,date

我想为员工计算External mission over time

我有四种情况:

  1. No check-in-out && Not work day [周末] 所以员工应该把所有的任务时间都当作加班
  2. 没有签到&&工作日[缺席],所以员工应该只把任务期从工作期中拿出来
  3. 有签到&& 非工作日 [周末],因此员工应仅从这些签到中取出任务期间
  4. 有签出和工作日,因此员工应仅在这些签出和工作期间以外的任务期间进行。

例子 :

emp_num     date         att_start   att_end    mission-in  mission-out
  672      2015-3-4       07:05:00    13:30:00   12:12:00    20:00:00

emp_num      date         trans_in     trans_out 

 672       2015-3-4       06:54:00     11:10:00
 672       2015-3-4       12:00:00     14:05:00
4

1 回答 1

1

您可以通过从该表的副本中获取帮助来遍历您的表:

关于您的问题,假设您的表格是:

DECLARE @userData TABLE(
                         userId int NOT NULL,
                         /*Other fields*/
                        );

你表的数据是:

INSERT INTO @userData
/*A SELECT or values*/

现在创建表的副本:

DECLARE @userData_2 TABLE(
                         userId int NOT NULL,
                         /*Structure should be the same as @userData*/
                        );
INSERT INTO @userData_2
SELECT * FROM  @userData

现在您可以执行循环并做任何您想做的事情:

DECLARE @userId INT
WHILE EXISTS (SELECT * FROM @userData_2)
BEGIN
SET @userId=(SELECT TOP 1 userId FROM @userData)
/*

DO YOUR TRANSACTION HERE

*/
DELETE FROM @userData_2 WHERE userId=@userID
END

注意:这假设 userId 是唯一的,如果不是,那么您需要有一个唯一的字段,或者使用复合字段而不是 userId。

于 2015-04-08T10:32:14.023 回答