簡體   English   中英

在SQL Server中使用DATEDIFF計算工作時間

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM