Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 如何在sql server 2008中添加时间?_Sql Server 2008 - Fatal编程技术网

Sql server 2008 如何在sql server 2008中添加时间?

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

我想计算员工在上午9:00到下午18:00之间花费的总小时数

我的数据库是这样的

我该怎么做

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小时?如果您使用存储过程插入新行,您的任务会简单得多,自动计算自上次输入以来经过的时间。。。然后你会有一个列,列上你所花费的时间,你只需要把它们加起来。