Для заданного интервала лет, чтобы получить количество дней в неделю (понедельник, вторник, сеть,..., солнце) года
Я хочу найти все решения для этого "Для заданного интервала лет, чтобы получить количество дней в неделю (понедельник, вторник, сеть,..., солнце) года"
Кто-нибудь знает другой ответ? поделитесь пожалуйста;)
это мой запрос:)
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;
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
хотя простой привел к тому, что вам пришлось проделать много дополнительной работы, чтобы ваше решение заработало.