Для заданного интервала лет, чтобы получить количество дней в неделю (пн, вт, веб, вс) года

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

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

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

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;

person aaaaaa aaaaaaaa    schedule 08.05.2012    source источник


Ответы (1)


Вы должны воспользоваться арифметикой дат 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 модификатор модели формата; это удаляет конечные пробелы.

Как правило, при работе с датами всегда предпочтительнее использовать даты, а не числа или символы. Ваш пункт connect by CONNECT BY LEVEL < &end_year - &start_year + 2, несмотря на свою простоту, заставил вас проделать много дополнительной работы, чтобы ваше решение заработало.

person Ben    schedule 08.05.2012
comment
привет Бен, ваш запрос просто возвращает количество дней в интервале года [начало_года, конец_года]. но мне нужно вернуть количество дней (в неделю) за каждый год. - person aaaaaa aaaaaaaa; 08.05.2012