【发布时间】:2015-04-08 09:02:10
【问题描述】:
如果我有一个像这样的表变量,如何循环这个变量来进行一些处理:
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 ;
根据 cmets 的整体情况:
如果工作开始于:att_start_time,结束于att_end_time(工作时间)
每个员工都可以在同一日期多次入住和退房,以便我们跟踪他。
签到存储在transtime_in
和结帐存储在transtime_out
我有day_flag,所以我可以知道这一天是“W”工作日还是“E”周末
现在考虑除了emp_num ,date之外的所有这些信息
我想为员工External mission over time 计算:
我有四种情况:
- 没有签到&&不是工作日[周末]所以员工 应将所有任务期间视为加班
- 没有签到&&工作日[缺席],所以员工应该 仅将任务期间从工作期间中取出
- 有退房 && 非工作日 [周末] 所以 员工应该只从这些任务中取出任务期间 退房
- 有签到&&工作日所以员工应该采取 仅在这些签到之外的任务期间,同时 下班时间。
例子:
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
【问题讨论】:
-
您要进行什么样的处理? SQL 通常不喜欢循环。最好将数据作为一个集合来处理。如果您提供更多详细信息,则可以避免使用循环,从而提高结果查询的性能。
-
您还应该知道,表格本身没有顺序。由于在您的
SELECT查询(例如TOP或FETCH子句)中没有执行任何限制,所以ORDER BY完全没有意义。 -
@Aidan 我想计算并插入另一个表
-
@just_name - 澄清根本没有帮助。我们的意思是您要执行的具体计算是什么?您当前的方法似乎非常程序化(首先我会这样做并将结果放在一个表格中,然后我会这样做并将这些结果放在一个表格中,然后我会做下一件事……)。当您可以构建一个单独的查询来描述您想要什么,而不是如何做到这一点,然后让查询优化器确定如何最好地实现该结果时,SQL 的效果最好。
-
如果这就是您想要做的......根据该逻辑编写查询并将结果插入表中。根据您的描述,我们将假设您不需要循环,而您假设您需要。如果您解释了您要做什么,也许我们可以停止假设并开始提供帮助。
标签: sql sql-server sql-server-2012 table-variable