2013-05-03 162 views
2

是否有一種「簡單」的方法來計算兩個日期之間某一天的計數(例如,我想知道2000年1月1日至今的星期二的數量)?此外,同樣的問題更廣泛地適用於不同的單位(例如,兩個日期之間有多少2pms,Februaries有多少,8月21日有多少等等)......我最好的想法是,是這樣的:兩個日期之間的特定日期的數量

with calendar as (
    select  to_char(:start + level - 1, 'DAY') dayOfWeek 
    from  dual 
    connect by level <= ceil(:end - :start) 
) 
select dayOfWeek, count(dayOfWeek) 
from  calendar 
group by dayOfWeek; 

我將不得不創建一個視圖 - 硬編碼的開始和結束日期 - 使它方便(ish)使用;或者寫一個函數來完成骯髒的工作。那會不會是困難的,但我不知道是否已經有一個Oracle功能,可以做到這一點,佔之類的飛躍天等


編輯This的相關鏈接時彈出我發佈了這個。這或多或少地回答了幾天的問題,我知道在某些月份我可以使用months_between函數。任何其他我應該知道的相關功能?

+1

見http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions002.htm#i88891有關Oracle日期函數的列表。 – 2013-05-03 12:39:35

+1

建立一個[日曆表](http://www.perpendulum.com/2012/06/calendar-table-script-for-oracle/),你所有的日期問題都會消失。 – GarethD 2013-05-03 12:58:29

回答

1

用您的日期替換開始/結束日期。從一月1-2013 TUE的這個查詢計算的數量發展到今天,它是18:

SELECT count(*) number_of_tue 
    FROM 
(
SELECT TRUNC(TO_DATE(Sysdate), 'YEAR') + LEVEL-1 start_dt 
     , To_Char(TRUNC(TO_DATE(Sysdate), 'YEAR') + LEVEL - 1, 'DY') wk_day 
     , To_Char(TRUNC(TO_DATE(Sysdate), 'YEAR') + LEVEL - 1, 'D') wk_day# 
     , trunc(Sysdate) end_dt 
    FROM DUAL 
CONNECT BY LEVEL <= trunc(Sysdate) - trunc(Sysdate, 'YEAR') -- replace with your start/end dates 
) 
WHERE wk_day# = 3 -- OR wk_day = 'TUE' -- 
/
+0

謝謝,但這與我的查詢有何不同?你只是使用子查詢而不是CTE。 – Xophmeister 2013-05-03 13:07:18

+0

沒有差異。你稱之爲CTE或我的查詢。在發佈我的郵件之前,我沒有檢查您的查詢。我的查詢有更多的日期來測試並查看實際日期和星期幾等...選擇任何一個來創建視圖。這不可能比這更容易。 – Art 2013-05-03 13:29:47

相關問題