问题:仅使用班次日期计算两个日期之间的时间量。轮班日期是唯一允许计算时间的时间。因此,在下面的数据示例中,我希望独立地查看每个#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,如果这有助于可用的命令。有人可以帮我弄清楚如何实现这个目标吗?
答案 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表中的数据似乎与您要求的内容不匹配。