Sql server SQL Server-使用轮班计算日期之间的时间

Sql server SQL Server-使用轮班计算日期之间的时间,sql-server,date,sql-server-2008-r2,Sql Server,Date,Sql Server 2008 R2,问题:仅使用轮班日期计算两个日期之间的时间量。轮班日期是唯一允许计算时间的时间。因此,在下面的数据示例中,我想单独查看每个拒绝记录的时间差。理想情况下,我也想考虑午休时间,但我不知道这是否会让事情变得更难处理 数据: CREATE TABLE #Shifts ( ShiftId INT ,StartTime DECIMAL(6,2) ,EndTime DECIMAL(6,2) ,LunchStart DECIMAL(6,2) ,LunchEnd DECIMAL(6,2) );

问题:仅使用轮班日期计算两个日期之间的时间量。轮班日期是唯一允许计算时间的时间。因此,在下面的数据示例中,我想单独查看每个拒绝记录的时间差。理想情况下,我也想考虑午休时间,但我不知道这是否会让事情变得更难处理

数据:

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的新手,这个问题让我完全难倒了。我甚至不知道从哪里开始。我正在使用SQLServer2008R2,如果这对可用命令有帮助的话。有人能帮我弄清楚如何做到这一点吗?

如果可能的话,最好按照评论中的建议使用datetime2,尽管我知道在你的情况下不是这样。如果你这样做,那么答案是简单易读的

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我猜你指的是轮班表而不是拒绝表?拒绝表中的数据似乎与您的要求不匹配。

您能否解释并提供所需输出的示例?您是否实际将开始/结束时间存储为十进制?如果将它们存储为datetime,则至少可以对这些值执行datediff。在那之后,你可以做datediff来看看午餐的时间有多长,然后从花费的总时间中减去。按照上面所示的方法,尤其是当轮班时间超过一天时,我使用的ERP系统会将它们存储为十进制。我不同意他们的决定。我想我必须先把它转换成datetime。正如我在上面的评论中所说,由于我使用的ERP系统,我一直在使用小数作为轮班时间。我不喜欢它是如何设置的。好的,这个答案有用吗?如果你愿意,我可以做一个在不同日期返回小时和分钟,包括午餐时间的服务?我建议的输出格式是否适合您,或者您是否希望采用其他方式?我认为小时和分钟是我所需要的。你上面所说的只是告诉我每班轮班的时间,而不是午夜的轮班。2我已经根据你的评论更改了答案。希望有帮助,我明白了。它可以用来计算轮班时间。谢谢你。我想我可能问了一个很糟糕的问题。我试图计算拒绝表中FirstRejectedDate和LastAcceptedDate之间的总时间。我希望它们彼此独立计算。换句话说,将每一行视为它们自己的行。如果可以的话,我会对他们做一个简单的DATEDIFF,做得很好,但我需要知道上面给出的轮班工作时间。基本上,与上述班次重叠的日期之间的时间间隔。