2014-10-09 73 views
1

我有一個問題,我需要使用SQL來解決。問題是我必須計算工作時間之間的日期,工作時間以外的工作時間以及週末的工作時間。工作時間在0800至1600年之間。某種功能應該可以做到這一點,但我無法圍繞如何包裹我的頭。誰能幫我?計算兩個日期之間的秒數和分類

實施例的數據(SQL Server 2008 R2的SP2):

Opendate裏:2014-10-01 10:33:57.767 Closedate:2014年10月9日10:33:52.733

+0

可以打開和closedate跨越多個週末的時期? – pancho018 2014-10-09 09:40:10

+0

是的,它可以。對跨度沒有限制。查看我的工作時間更新。 – 2014-10-09 10:51:51

+0

可能重複[計算兩個日期之間的時間差(僅工作小時數)(分鐘)](http://stackoverflow.com/questions/3296923/calculate-time-difference-only-working-hours-in-minutes-between-兩個日期) – pancho018 2014-10-10 12:19:03

回答

0

我使用這些函數返回兩個日期之間的非週末秒:

CREATE FUNCTION [dbo].[DateDiff_NoWeekends](
    @date1 DATETIME, 
    @date2 DATETIME 
) 

RETURNS INT AS BEGIN 
    DECLARE @retValue INT 

    SET @date1 = dbo.__CorrectDate(@date1, 1) 
    SET @date2 = dbo.__CorrectDate(@date2, 0) 

    IF (@date1 >= @date2) 
     SET @retValue = 0 
    ELSE BEGIN 
     DECLARE @days INT, @weekday INT 
     SET @days = DATEDIFF(d, @date1, @date2) 
     SET @weekday = DATEPART(dw, @date1) - 1 

     SET @retValue = DATEDIFF(s, @date1, @date2) - 2 * 24 * 3600 * ((@days + @weekday)/7) 
    END 

    RETURN @retValue 
END 

GO 


CREATE FUNCTION [dbo].[__CorrectDate](
    @date DATETIME, 
    @forward INT 
) 

RETURNS DATETIME AS BEGIN 
    IF (DATEPART(dw, @date) > 5) BEGIN 

     IF (@forward = 1) BEGIN 
      SET @date = @date + (8 - DATEPART(dw, @date)) 
      SET @date = DateAdd(Hour, (8 - DatePart(Hour, @date)), @date) 
     END ELSE BEGIN 
      SET @date = @date - (DATEPART(dw, @date)- 5) 
      SET @date = DateAdd(Hour, (18 - DatePart(Hour, @date)), @date) 
     END 
     SET @date = DateAdd(Minute, -DatePart(Minute, @date), @date) 
     SET @date = DateAdd(Second, -DatePart(Second, @date), @date) 
    END 

    RETURN @date 
END 

這將有助於上手也找到了其他任務的解決方案。

這裏是您的樣本數據的sql-fiddle demo

SELECT [weekday-seconds between] = 
    (dbo.DateDiff_NoWeekends('2014-10-01 10:33:57.767','2014-10-09 10:33:52.733')) 

=> 518395 
+0

嗨,謝謝你的回覆。你如何將工作時間納入這個? – 2014-10-09 10:50:32

+0

@AndréBondevik:我還沒有時間進一步調查。但我想你可以使用類似的方法。你需要一個標準化開始和結束日期的標準。除此之外,您可以通過'SELECT DATEDIFF(s,'2014-10-09 08:00:00','2014-10-09 16:00:00')'(28800)計算秒數,並將其乘以與[兩天之間的工作日數](http://stackoverflow.com/questions/252519/count-work-days-between-two-dates)。 – 2014-10-09 11:09:07

相關問題