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

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

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

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

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хотя простой привел к тому, что вам пришлось проделать много дополнительной работы, чтобы ваше решение заработало.

Другие вопросы по тегам