如何在特定日期计算输入和输出之间的小时数?

时间:2015-07-02 08:13:19

标签: sql sql-server

我需要计算进出日期之间的小时数。下面的示例表包含在同一结构中。日期的第一行保持IN,第二行保存OUT时间。

Emp_No  Stamp_Date  Stamp_Time

815     2015-02-03  1900-01-01 15:22:00.000
815     2015-02-03  1900-01-01 07:12:00.000
815     2015-02-04  1900-01-01 07:12:00.000
815     2015-02-04  1900-01-01 15:24:00.000
815     2015-02-06  1900-01-01 07:05:00.000
815     2015-02-06  1900-01-01 15:17:00.000
815     2015-02-07  1900-01-01 15:27:00.000
815     2015-02-07  1900-01-01 07:05:00.000
815     2015-02-08  1900-01-01 07:03:00.000

1 个答案:

答案 0 :(得分:1)

您可以尝试以下操作:

-- Create demo data
CREATE TABLE #stamps (Emp_No int, Stamp_Date date, Stamp_Time time)

INSERT INTO #stamps(Emp_No, Stamp_Date, Stamp_Time)
VALUES  (815,N'2015-02-03',N'1900-01-01 15:22:00.000'),
        (815,N'2015-02-03',N'1900-01-01 07:12:00.000'),
        (815,N'2015-02-04',N'1900-01-01 07:12:00.000'),
        (815,N'2015-02-04',N'1900-01-01 15:24:00.000'),
        (815,N'2015-02-06',N'1900-01-01 07:05:00.000'),
        (815,N'2015-02-06',N'1900-01-01 15:17:00.000'),
        (815,N'2015-02-07',N'1900-01-01 15:27:00.000'),
        (815,N'2015-02-07',N'1900-01-01 07:05:00.000'),
        (815,N'2015-02-08',N'1900-01-01 07:03:00.000')

-- your Part
SELECT  pvt.emp_no, pvt.stamp_date, pvt.[1] as InTime, pvt.[2] as OutTime, 
        DATEDIFF(HOUR,pvt.[1], pvt.[2]) as differenceInHours
FROM (
    SELECT s.Emp_No, s.Stamp_Date, s.Stamp_Time, 
        ROW_NUMBER() OVER(PARTITION BY s.emp_no, s.stamp_date ORDER BY s.stamp_time) as inOut
    FROM #stamps s
) as dat
PIVOT(
    MAX(dat.stamp_time)
    FOR inOut IN([1],[2])
) as pvt

-- Cleanup
DROP TABLE #stamps

我正在使用pivot来从行中创建一些列。 [1]是您进入的时间,[2]是您外出的时间。

之后只需使用datediff来计算差异。

由于事实,没有给出信息,如果记录没有out-Time怎么办我只是假设它应该为null并且差异也是null。如果需要,您可以使用isnull