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;
4

1 に答える 1

0

Oracle の日付演算を利用する必要があります。2 つの日付を互いに差し引くと、2 つの日付の間の日数である数値が返されます。整数の差がない場合は、実際の差が返されます。

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 byCONNECT BY LEVEL < &end_year - &start_year + 2は単純ですが、ソリューションを機能させるために多くの追加作業を行う必要があります。

于 2012-05-08T08:17:14.657 に答える