Sql server 2008 如何在sql server 2008中添加时间?
我想计算员工在上午9:00到下午18:00之间花费的总小时数 我的数据库是这样的 我该怎么做Sql server 2008 如何在sql server 2008中添加时间?,sql-server-2008,Sql Server 2008,我想计算员工在上午9:00到下午18:00之间花费的总小时数 我的数据库是这样的 我该怎么做 AttendanceId EmpId CheckTime CheckType ------------------------------------------------------------------------- 3 5 2013-01-03 09:00:15.000
AttendanceId EmpId CheckTime CheckType
-------------------------------------------------------------------------
3 5 2013-01-03 09:00:15.000 1 (Login)
4 5 2013-01-03 11:00:00.000 2 (Logout)
5 5 2013-01-03 11:30:00.000 1
6 5 2013-01-03 13:00:00.000 2
7 5 2013-01-03 13:30:00.000 1
8 5 2013-01-03 16:00:00.000 2
9 5 2013-01-03 16:30:00.000 1
10 5 2013-01-03 18:00:00.000 2
要获得两个日期之间的差异,请使用
DATEDIFF
函数:
不过,我想你需要一排一排地做。由于表的结构,您不能只进行简单的查询。由于您的
登录
/注销
值位于同一列中,因此可以更方便地先查看登录/注销时间,然后获取日期差异
,以确定员工在场的总时间
查询的PIVOT
部分如下:
select empid, [1], [2]
from
(
select empid, checktime, checktype,
row_number() over(partition by empid, checktype order by checktime) rn
from yourtable
) src
pivot
(
max(checktime)
for checktype in ([1], [2])
) piv
看
其结果是:
| EMPID | 1 | 2 |
---------------------------------------------------------------------------
| 5 | January, 03 2013 09:00:15+0000 | January, 03 2013 11:00:00+0000 |
| 5 | January, 03 2013 11:30:00+0000 | January, 03 2013 13:00:00+0000 |
| 5 | January, 03 2013 13:30:00+0000 | January, 03 2013 16:00:00+0000 |
| 5 | January, 03 2013 16:30:00+0000 | January, 03 2013 18:00:00+0000 |
一旦数据位于该结构中,您就可以通过应用函数轻松获得时间差
生成员工登录时间的最终查询为:
select empid, sum(SecondsDiff) / 3600 as TotalHours
from
(
select empid, datediff(ss, [1], [2]) SecondsDiff
from
(
select empid, checktime, checktype,
row_number() over(partition by empid, checktype order by checktime) rn
from yourtable
) src
pivot
(
max(checktime)
for checktype in ([1], [2])
) piv
) src
group by empid
看
结果是:
| EMPID | TOTALHOURS |
----------------------
| 5 | 7 |
坦率地说,我的想法是将所有登录时间和注销时间相加,然后从总登录时间中减去总注销时间。但不幸的是,时间格式不支持“+”运算符。您是否看过与日期算法相关的SQL Server 2008文档,特别是函数?这应该能满足你的需要,是一个员工还是所有员工?在什么时期?什么是“一天”?如果有人工作超过午夜怎么办?您是否正在尝试获取每天24小时的摘要,例如,如果某人工作4小时,休息吃晚饭,然后在19:00再次登录,如果您在午夜检查,这是否算作工作9小时?如果您使用存储过程插入新行,您的任务会简单得多,自动计算自上次输入以来经过的时间。。。然后你会有一个列,列上你所花费的时间,你只需要把它们加起来。