【发布时间】:2014-06-19 09:52:35
【问题描述】:
我有一个包含以下数据的表格。
Employee TimeRegister1 TimeRegister2 TimeRegister3 TimeRegister4
77 2014-04-01 11:51:43.000 2014-04-01 14:03:52.000 2014-04-01 14:17:01.000 2014-04-01 16:01:12.000
77 2014-04-03 09:48:33.000 2014-04-03 12:13:43.000 2014-04-03 12:22:27.000 2014-04-03 14:03:43.000
181 2014-04-02 08:24:34.000 2014-04-02 13:01:10.000 2014-04-02 14:30:31.000 2014-04-02 18:04:04.000
我需要在另一列上写下根据每个员工/天的每对列之间的差异(奇数减偶数)计算得出的总数。
在上面的例子中,对于Employee 77 and 2014-04-01,它应该在另一列写上TimeRegister 2 - TimeRegister 1、TimeRegister 4 - TimeRegister 3之间的差值之和。
应该输出这样的东西(秒无关,只需要小时/分钟):
Employee TimeRegister1 TimeRegister2 TimeRegister3 TimeRegister4 CALCULATEDCOL
77 2014-04-01 11:51:43.000 2014-04-01 14:03:52.000 2014-04-01 14:17:01.000 2014-04-01 16:01:12.000 2014-04-01 03:56:00.000
除了TimeRegister 列最多可以有 30 个(我只显示了 4 个列,但可能更多),所以我需要对每个奇数/偶数对进行排序计算,直到它用完列。
任何帮助我如何在 SQL 中实现这一点将不胜感激。谢谢。
【问题讨论】:
-
是否有一列指示“In”与“Out”(即当前您假设有偶数条记录和寄存器方向)。此外,“DateTime”实际上只是一个时间差,即应该是具有不同数据类型的列,如时间?
-
您好斯图尔特,感谢您的意见。列“TimeRegister1”是“IN”列(当天的第一次注册 - 始终为 IN)。有时甚至可能没有时间登记(例如员工签到但忘记签出)。当然,这种情况应该被忽略。假设一名员工在午餐时结账,当他回来时忘记签入。当他在一天结束时退房时,这将被视为入住。异常将被手动处理(即添加忘记的签入/签出)并相应地重新计算。
-
那是一个非常糟糕的桌子设计。听起来它是从物理形式而不是通过考虑数据来设计的。理想情况下,所有这些日期时间值都将位于单个列中 - 每个条目都有单独的行。您可以通过先对此数据执行
UNPIVOT来近似此值。 -
您好 Damien,原始表确实在单个列中有日期时间值,每个条目都有单独的行。这是由 PIVOT 操作生成的表。我们这样做是为了将其传递到软件网格,以便 HR 人员可以在一行中使用 IN 与 OUT 进行更好的分析。当然,我可以在原始表上工作,然后在完成所有计算后将其全部旋转。有什么想法吗?
标签: sql sql-server date datediff difference