2012-05-08 2 views
1

Я хочу найти все решения для этого «За определенный промежуток времени, чтобы получить количество дней в неделю (mon, tue, web, ..., sun) года «В течение заданного промежутка времени, чтобы получить количество дней в неделю (mon, tue, web, ..., sun) года

кто-нибудь знает другой ответ? поделиться, пожалуйста;)

это мой запрос :)

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 arithmetic возвращает тип данных 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

hi Ben, ваш запрос просто возвращает количество дней в интервале year [start_year, end_year]. но мне нужно вернуть количество дней (в неделю) за каждый год. –

Смежные вопросы