2012-05-16 72 views
0

我在查詢使用id,startDateTime,endDateTime設置的表。比方說,第1行看起來是這樣的:返回日期範圍內的唯一日期

id  startDateTime  endDateTime  
100  2/9/2012 20:55  3/21/2012 10:43 

我需要查詢以上這樣的,我得到的在上述範圍內的所有天重複計數。 我的預期結果將在42以上,因爲從2/9到3/21有42個獨特日曆天。 Datediff,因爲它看起來時間片給了我41天。我已經嘗試過各種各樣的datediff和timediff迭代,試圖讓它工作,但找不到任何適用於所有場景的東西。任何關於如何在SQL中完成的建議?

我開始查詢,如下圖所示:

SELECT ConditionStatus.ID, 
    SUM((DATEDIFF(ConditionStatus.endDate,ConditionStatus.startDate))) AS Duration 
WHERE ID = 100 

我的查詢返回的41這在技術上是準確的一個時間,但我需要條件,例如,在日期的範圍內的所有日期越來越計數1

我試圖模仿我們在我們的數據倉庫中使用的一些邏輯,在那裏我們堅持每個有活動日期的計數爲1。

感謝, 鮑勃

+0

在你的問題添加更多細節 –

回答

3

最基本的答案是,你可以使用DATEDIFF()加1,因爲你要包括當前的一天。

例如:

mysql> select datediff(current_date(),current_date()) + 1; 
+---------------------------------------------+ 
| datediff(current_date(),current_date()) + 1 | 
+---------------------------------------------+ 
|           1 | 
+---------------------------------------------+ 
1 row in set (0.00 sec) 

擴大你的原來的例子,您可以將字符串轉換爲日期時間,然後丟棄時間部分,然後計算出包容日期數,像這樣的查詢:

mysql> SELECT ABS(DATEDIFF(DATE(STR_TO_DATE('2/9/2012 20:55','%m/%d/%Y %H:%i')), 
    ->   DATE(STR_TO_DATE('3/21/2012 10:43','%m/%d/%Y %H:%i')))) + 1 as days_in_range; 
+---------------+ 
| days_in_range | 
+---------------+ 
|   42 | 
+---------------+ 
1 row in set (0.00 sec) 

mysql> SELECT ABS(DATEDIFF(DATE(STR_TO_DATE('3/21/2012 10:43','%m/%d/%Y %H:%i')), 
    ->   DATE(STR_TO_DATE('2/9/2012 20:55','%m/%d/%Y %H:%i')))) + 1 as days_in_range; 
+---------------+ 
| days_in_range | 
+---------------+ 
|   42 | 
+---------------+ 
1 row in set (0.00 sec) 
0

看到這個答案 - How do I select the number of distinct days in a date range?

看一看,然後再使用@ Ike的答案。如果您添加+1,那麼在時間值爲00:00:00的情況下,您會得到太多。

select datediff(days, '2/9/2012 20:55', '3/21/2012 10:43')返回41個

select datediff(days, '2/9/2012 20:55', '3/21/2012 10:43') + 1收益42

這是打破 -

select datediff(days, '2/9/2012 20:55', '3/21/2012 00:00:00') + 1收益42

這是錯誤的答案。它不應該包括最後一天。

這裏的解決方法 -

datediff(days, '2/9/2012 20:55', dateadd(seconds, -1, '3/21/2012 00:00:00') + 1