我需要计算进出日期之间的小时数。下面的示例表包含在同一结构中。日期的第一行保持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
答案 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
。