SQL Server - 计算工作班次的日期之间的时间

时间:2017-01-18 22:45:01

标签: sql-server date sql-server-2008-r2

问题:仅使用班次日期计算两个日期之间的时间量。轮班日期是唯一允许计算时间的时间。因此,在下面的数据示例中,我希望独立地查看每个#Rejections记录的时差。理想情况下,我也想考虑午休时间,但如果这样做,那就更难以处理。

数据:

CREATE TABLE #Shifts
(
  ShiftId INT
  ,StartTime DECIMAL(6,2)
  ,EndTime DECIMAL(6,2)
  ,LunchStart DECIMAL(6,2)
  ,LunchEnd DECIMAL(6,2)
);

INSERT INTO #Shifts VALUES (1, 6.00, 16.75, 11.75, 12.50) /*6am to 4:45pm*/
INSERT INTO #Shifts VALUES (2, 17.00, 3.75, 23.00, 23.75) /*5pm to 3:45am (next day)*/
INSERT INTO #Shifts VALUES (3, 5.00, 17.75, 12.00, 12.75) /*5am to 5:45pm*/

CREATE TABLE #Rejections
(
  JobId INT
  ,WeldId INT
  ,IndicationNum INT
  ,FirstRejectedDate DATETIME
  ,LastAcceptedDate DATETIME
);

INSERT INTO #Rejections VALUES (500, 700, 2, '2017-01-03 22:35:31.000', '2017-01-04 01:38:16.000')
INSERT INTO #Rejections VALUES (500, 701, 3, '2017-01-04 01:48:55.000', '2017-01-06 09:21:11.000')

我正在寻求一些如何解决这个问题的帮助。我是SQL Server的新手,这个问题让我完全难过。我甚至都不知道从哪里开始。我正在使用SQL Server 2008 R2,如果这有助于可用的命令。有人可以帮我弄清楚如何实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

如果可能的话,最好使用datetime2(评论中建议的not datetime) - 尽管我理解在你的情况下它并非如此。如果你这样做,答案很简单&容易阅读...

SELECT DATEDIFF(mi, StartTime, EndTime) - DATEDIFF(mi, LunchStart, LunchEnd) 
FROM #shifts

我知道它不适用于你,但我希望将其展示给其他人,与之后的怪异代码相比较。它非常丑陋但可以用十进制格式进行这些计算。此代码将为您提供午休时间(分钟),总分钟班次,然后将总分为几小时和几小时。分钟,所以你可以使用你想要的任何东西。

SELECT  (CASE WHEN LunchEnd < LunchStart THEN 24 ELSE 0 END +
        LunchEnd - LunchStart) * 60 AS LunchMins
    , (CASE WHEN EndTime < StartTime THEN 24 ELSE 0 END +
        EndTime 
        - StartTime 
        - (CASE WHEN LunchEnd < LunchStart THEN 24 ELSE 0 END + LunchEnd - LunchStart))
        * 60 AS TotalShiftMins
    , ROUND((CASE WHEN EndTime < StartTime THEN 24 ELSE 0 END +
        EndTime 
        - StartTime 
        - (CASE WHEN LunchEnd < LunchStart THEN 24 ELSE 0 END + LunchEnd - LunchStart))
        ,0) AS TotalShiftHoursOnly
    , ((CASE WHEN EndTime < StartTime THEN 24 ELSE 0 END +
        EndTime 
        - StartTime 
        - (CASE WHEN LunchEnd < LunchStart THEN 24 ELSE 0 END + LunchEnd - LunchStart))
        * 60) % 60 AS TotalShiftMinsOnly
    , *
FROM #Shifts

PS我假设你的意思是#Shifts表,而不是#Rejections表? #Rejections表中的数据似乎与您要求的内容不匹配。