2012-05-08 36 views
1

我想查找所有解決方案「在一定的時間間隔內獲得每週的天數(星期一,星期二,網絡,...,太陽)「在給定的時間間隔內,獲得每年(星期一,星期二,網絡,...,太陽)的天數

有人知道其他答案嗎?分享請;)

這是我的查詢:)

WITH dat AS 
(SELECT &&start_year + level - 1 cur_year, DECODE(MOD(&start_year + level - 1, 4), 0, 0, 1) no_leap, 
TO_NUMBER(TO_CHAR(TO_DATE('01.01.'||TO_CHAR(&start_year + level - 1)), 'D')) d 
FROM dual 
CONNECT BY LEVEL < &end_year - &start_year + 2) 
SELECT cur_year, 
51 + DECODE(no_leap, 1, DECODE(d, 1, 2, 1), DECODE(d, 1, 2, 7, 2, 1)) mon, 
51 + DECODE(no_leap, 1, DECODE(d, 2, 2, 1), DECODE(d, 2, 2, 1, 2, 1)) tue, 
51 + DECODE(no_leap, 1, DECODE(d, 3, 2, 1), DECODE(d, 3, 2, 2, 2, 1)) wed, 
51 + DECODE(no_leap, 1, DECODE(d, 4, 2, 1), DECODE(d, 4, 2, 3, 2, 1)) thu, 
51 + DECODE(no_leap, 1, DECODE(d, 5, 2, 1), DECODE(d, 5, 2, 4, 2, 1)) fri, 
51 + DECODE(no_leap, 1, DECODE(d, 6, 2, 1), DECODE(d, 6, 2, 5, 2, 1)) sat, 
51 + DECODE(no_leap, 1, DECODE(d, 7, 2, 1), DECODE(d, 7, 2, 6, 2, 1)) sun 
FROM dat; 

回答

0

你應該考慮Oracle的日期運算的優勢。如果您將兩個日期相互減去,則返回一個數字,即兩個日期之間的天數。如果有不是整數的區別,則返回的實際差異:

SQL> select sysdate - to_date('20120504 15', 'yyyymmdd hh24') from dual; 

SYSDATE-TO_DATE('2012050415','YYYYMMDDHH24') 
-------------------------------------------- 
            3.76489583 

請注意,這不包括timestamp,只有date數據類型。算術timestamp返回一個interval數據類型。

大部分的解決方案將是

with dates as ( 
    select to_char(to_date('&start_year','yyyy') + level, 'fmDAY') as days 
    from dual 
    connect by level < to_date('&end_year','yyyy') - to_date('&start_year','yyyy') 
     ) 
    select ... 

注意格式模型的fm modifier;這刪除了尾隨空格。

作爲一般規則,在處理日期時,總是優選使用日期,而不是數字或字符。你的connect by條款CONNECT BY LEVEL < &end_year - &start_year + 2,雖然很簡單,但爲了讓您的解決方案發揮作用,您還需要做大量額外的工作。

+0

嗨本,你的查詢只返回間隔年份[start_year,end_year]中的天數。但我需要返回每年(每週)的天數。 –

相關問題