2017-01-31 55 views
1

兩個日期時間列之間的區別我有兩列(創建和ResolutionDate)與日期時間的表值 enter image description here如何獲得SQL

我需要創建的列和resolutiondate之間的差異來獲得從創建日期開始需要花費的天數。

而且我也只需要與工作日內或網絡天即週一至週五(不是週末和節假日)來獲得結果。

例如,如果我創建了:2015-09-22和resolutiondate:2015-09-30,那麼結果應該是6天,因爲兩天是星期六,星期日是我選擇的創建日期和分辨率日期之間。

請讓我知道我可以工作了與SQL。

+0

你有沒有考慮節假日以及帶來的麻煩? –

+0

是的,我需要考慮的假期太@vkp – user7463647

+0

我想你會需要一個自定義的表來考慮公司的假期。 – Paparazzi

回答

1

爲計算工作日內兩個日期之間的區別,你可以使用下面的函數。請注意,這隻會在沒有周末的情況下計算,如果您有中間的假期,它會將其計算爲平日。

public double GetBusinessDays(DateTime startD, DateTime endD) 
    { 
     double calcBusinessDays = 1 + ((endD - startD).TotalDays * 5 - (startD.DayOfWeek - endD.DayOfWeek) * 2)/7; 
     if ((int)endD.DayOfWeek == 6) calcBusinessDays--; 
     if ((int)startD.DayOfWeek == 0) calcBusinessDays--; 

     return calcBusinessDays; 
    } 
+0

似乎比我會猜到的更復雜,但我相信你已經測試過。 +1 – Paparazzi

+0

它沒有假期工作。我想,如果一個人知道假期的數量,可以在結果 – NicoRiff

+0

@Paparazzi減去。 。 。其實,它看起來比我想象的要簡單。但是,再次,它不處理假期。另一方面,我不明白這與標籤「sql」和「sql-server」有什麼關係。 –

0

也許這樣的事情...跨應用部分可能是一個UDF

Declare @YourTable table (ID int,Created datetime, ResolutionDate datetime) 
Insert Into @YourTable values 
(1,'2015-09-22 13:35:38','2015-09-30 17:37:09'), 
(2,'2016-02-28 12:55:22','2016-02-29 12:55:44'), 
(3,'2015-09-22 13:30:31','2015-09-30 17:37:09') 

Select A.* 
     ,B.WorkingDays 
From @YourTable A 
Cross Apply (
       Select WorkingDays=count(*) 
       From (Select Top (DateDiff(DD,A.Created,A.ResolutionDate)+1) D=DateAdd(DD,Row_Number() over (Order By (Select NULL))-1,cast(cast(A.Created as date) as datetime)) From master..spt_values N1) D 
       Where D >= A.Created and D<= A.ResolutionDate 
        and DatePart(DW,D) not in (7,1) 
        and Cast(D as Date) Not In (Select Date From (Values 
             ('2016-01-01','New Year''s Day'), 
             ('2016-01-18','Martin Luther King, Jr,'), 
             ('2016-02-15','Washington''s Birthday'), 
             ('2016-03-25','Good Friday'), 
             ('2016-05-30','Memorial Day'), 
             ('2016-07-04','Independence Day'), 
             ('2016-09-05','Labor Day'), 
             ('2016-11-24','Thanksgiving'), 
             ('2016-11-25','Black Friday'), 
             ('2016-12-26','Christmas Day') 
           ) as H (Date,Name)) 
     ) B 

返回

ID Created     ResolutionDate   WorkingDays 
1 2015-09-22 13:35:38.000 2015-09-30 17:37:09.000 6 
2 2016-02-28 12:55:22.000 2016-02-29 12:55:44.000 1 
3 2015-09-22 13:30:31.000 2015-09-30 17:37:09.000 6 
0

如果您需要公司日期則與所有公司的工作表天

select ticket.ID, count(companyWorkDay.dt) 
from ticket 
left join companyWorkDay 
     on companyWorkDay.dt between ticket.created and ticket.resolution 
group by ticket.ID 

For填充表,一旦你得到了很多更容易查詢
你可以編寫一個查詢進入平日裏,然後就刪除公司假期