[英]Calculate working hours using DATEDIFF in SQL Server
我目前很難計算員工的總工作時間,尤其是夜班人員。 這是我的代碼:
DECLARE @StartTime time
DECLARE @EndTime time
SELECT @StartTime = CAST('Jun 04 2018 8:00PM' as time)
SELECT @EndTime = CAST('Jun 04 2018 5:00AM' as time)
SELECT
SUM((DATEDIFF(MINUTE, @StartTime, @EndTime) - isnull(datediff(minute, break_start, break_end), 0))/ 60.0)
FROM pmis.dbo.employee as a
LEFT JOIN pmis.dbo.time_reference as b ON b.code = ISNULL(a.TimeReference, 'TIME14')
cross apply
(
select break_start = case when b.break_from between @StartTime and @EndTime
then b.break_from
when @StartTime between b.break_from and b.break_to
then @StartTime
else NULL
end,
break_end = case when b.break_to between @StartTime and @EndTime
then b.break_to
when @EndTime between b.break_from and b.break_to
then @EndTime
end
) as d
WHERE
a.Shift = 0 and a.eid = 7078
我得到的是給定時間是這樣的
@StartTime = 8:00 AM
@EndTime = 5:00 PM
然后,結果完全是我想要的8.00
小時,但如果是這樣
@StartTime = 8:00 PM
@EndTime = 5:00 AM
然后我得到-15.00
如何解決這個問題? 謝謝
嘗試在結束時間早於開始時間時將1天(1440分鍾)添加到計算中。 但是,這不會處理墓地轉移中的中斷。 但是您以前的代碼有同樣的問題
SELECT
SUM((DATEDIFF(MINUTE, @StartTime, @EndTime)+
CASE WHEN @StartTime > @EndTime THEN 1440 ELSE 0 END -- CHANGE IN CODE IS HERE
- isnull(datediff(minute, break_start, break_end), 0))/ 60.0)
FROM pmis.dbo.employee as a
LEFT JOIN pmis.dbo.time_reference as b
ON b.code = ISNULL(a.TimeReference, 'TIME14')
cross apply
(
select break_start = case when b.break_from between @StartTime and @EndTime
then b.break_from
when @StartTime between b.break_from and b.break_to
then @StartTime
else NULL
end,
break_end = case when b.break_to between @StartTime and @EndTime
then b.break_to
when @EndTime between b.break_from and b.break_to
then @EndTime
end
) as d
WHERE
a.Shift = 0 and a.eid = 7078
解決它的另一種方法是使用日期時間數據類型而不是時間,然后您需要更改這些行
DECLARE @StartTime datetime
DECLARE @EndTime datetime
SELECT @StartTime = CAST('Jun 04 2018 8:00PM' as datetime)
SELECT @EndTime = CAST('Jun 04 2018 5:00AM' as datetime)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.