2015-11-02 53 views
0

我需要比較2個日期並返回中間的天數。這裏有一個表格爲例:SQL計算Datediff爲8個工作日的一半

+----+--------+-------------------------+-------------------------+ 
| id | userid |  datestarted  |  datefinished  | 
+----+--------+-------------------------+-------------------------+ 
| |  |       |       | 
| 1 |  23 | 2014-03-25 09:05:00.000 | 2014-03-25 12:15:00.000 | 
| 2 |  43 | 2014-03-25 09:05:00.000 | 2014-03-25 12:15:00.000 | 
| 3 |  23 | 2014-03-31 09:05:00.000 | 2014-03-31 12:15:00.000 | 
| 4 |  12 | 2014-03-25 09:05:00.000 | 2014-03-26 12:15:00.000 | 
+----+--------+-------------------------+-------------------------+ 

在前三種情況下,我們有同一天,只有小時不匹配。

Datestarted = 2014-03-25 09:05:00.000 

Datefinished = 2014-03-25 12:15:00.000 

我們只輸入hoursminutes

直到現在,WEE只需要表現出differencewhole number,沒有decimal points,並沒有這樣說:

DATEDIFF(carsharing.datestarted, carsharing.datefinished) 

但是現在,我們必須顯示的日期之間的difference0,5 day,如果是less而不是4,5 hours。如果差異是greater它應該保持爲1 day

在從表中更complecated最後一種情況下,我們也應該比較並顯示不同的兩天

Datestarted = 2014-03-25 09:05:00.000 

Datefinished = 2014-03-26 12:15:00.000 

這裏的差異的結果應該是1,5 days

+0

編輯您的樣本數據以表格的形式問題,與期望的結果一起。邏輯很難遵循。 –

+0

您是否考慮在C#中編寫CLR函數以TimeSpan的形式公開您的答案,然後可以將格式設置爲天,小時,分鐘,秒,毫秒的格式? – ewahner

+0

DATEDIFF(datepart,startdate,enddate)https://msdn.microsoft.com/zh-cn/library/ms189794。aspx – PeterRing

回答

1

您可以試試這個查詢。它以分鐘爲單位獲得差異,並將其乘以2以獲得0.5天的範圍。然後在計算上限值之前,將其分開24小時和60分鐘。一旦你有了它,它可以再次分開2。

當該值超過4.5 * 24 * 60(以分鐘爲4.5天),它僅需要由24 devided和60

查詢:

Select id, userid, datestarted, datefinished 
    , Days = Case When DATEDIFF(minute, datestarted, datefinished) > 4.5*60*24  
     then DATEDIFF(minute, datestarted, datefinished)/24/60 
     else CEILING(((2.0*DATEDIFF(minute, datestarted, datefinished))/24/60))/2 
    end 
From @dates 

輸出:

id userid datestarted     datefinished    Days 
1 23  2014-03-25 09:05:00.000  2014-03-25 12:15:00.000  0.500000 
2 43  2014-03-25 09:05:00.000  2014-03-25 12:15:00.000  0.500000 
3 23  2014-03-31 09:05:00.000  2014-03-31 12:15:00.000  0.500000 
4 12  2014-03-25 09:05:00.000  2014-03-26 12:15:00.000  1.500000 
5 12  2014-03-25 09:05:00.000  2014-03-29 12:15:00.000  4.500000 
6 12  2014-03-25 09:05:00.000  2014-03-29 22:15:00.000  4.000000 

樣本數據

declare @dates table(id int, userid int, datestarted datetime, datefinished datetime); 
insert into @dates(id, userid, datestarted, datefinished) values 
(1, 23, '2014-03-25 09:05:00.000', '2014-03-25 12:15:00.000') 
, (2, 43, '2014-03-25 09:05:00.000', '2014-03-25 12:15:00.000') 
, (3, 23, '2014-03-31 09:05:00.000', '2014-03-31 12:15:00.000') 
, (4, 12, '2014-03-25 09:05:00.000', '2014-03-26 12:15:00.000') 
, (5, 12, '2014-03-25 09:05:00.000', '2014-03-29 12:15:00.000') 
, (6, 12, '2014-03-25 09:05:00.000', '2014-03-29 22:15:00.000') 
2

我相信這是你在做什麼尋找 - 這將圓的差異0.5的任何東西在4.5小時一天,一切在那會去一整天:

Declare @StartDate DateTime = '2014-03-25 09:05:00.000', 
     @EndDate DateTime = '2014-03-26 12:15:00.000' 

;With TotalHours As 
(
    Select DateDiff(Minute, @StartDate, @EndDate)/60.0 As TotalHours 
) 
Select Case 
      When TotalHours % 24 = 0 
       Then Floor(TotalHours/24) 
      When TotalHours % 24 < 4.5 
       Then Floor(TotalHours/24) + 0.5 
      Else Floor(TotalHours/24) + 1.0 
     End As Days 
From TotalHours 
+0

很難跟蹤您目前所做的所有修改,但在撰寫此評論時,您的邊界檢查存在問題。要明白我的意思 - 將時間改爲完全相同,相隔一天 - 您將返回1.5天而不是1.0 – Bridge

+0

@Bridge感謝您指出該問題 - 糾正了此問題。 – Siyual

+1

然後你得到我的upvote! – Bridge

1
DECLARE 
    @StartDate datetime = '2014-03-25 09:05:00.000' 
    ,@EndDate datetime = '2014-03-26 09:05:00.000' 
;WITH d AS (SELECT DATEDIFF(d,@StartDate,@EndDate) Dys) 
,h AS (SELECT DATEDIFF(hh,@StartDate,@EndDate) Hrs) 
SELECT d.Dys + CASE WHEN (h.Hrs - d.Dys*24) = 0 THEN 0 ELSE CASE WHEN (h.Hrs - d.Dys*24) < 4.5 THEN 0.5 ELSE 1 END END 
FROM d,h 
+0

這似乎不起作用 - 我檢查日期23:59:00分開(例如將您的第二次設置爲'2014年3月26日09:04:00.000')它返回1.5天時,它實際上小於1.0 – Bridge

+0

@Bridge - 我修改了它。如果您希望計算更準確,例如包括分鐘數,請告訴我。我將修改查詢。 – Adish