sql >> データベース >  >> RDS >> PostgreSQL

特定の月の一連の週間隔を生成します

    SELECT generate_series(date_trunc('week', date '2013-02-01' + interval '6 days')
                         , date_trunc('week', date '2013-02-01' + interval '1 month - 1 day')
                         , interval '1 week')::date AS day
    UNION  SELECT date '2013-02-01'
    ORDER  BY 1;
    

    このバリアントには、副選択GREATESTは必要ありません。 またはGROUP BY 必要な行のみを生成します。よりシンプルに、より速く。 UNIONの方が安い 1行。

    • 月の最初の日に6日を追加します date_trunc('week', ...)の前 月の最初の月曜日を計算する 。

    • date_trunc('week', ...)の1か月を加算し、1日前を減算します。 その月の最後の月曜日を取得するには 。
      これは、1つのintervalに簡単に詰め込むことができます。 式:'1 month - 1 day'

    • UNION UNION ALL )月曜日としてすでに含まれている場合を除き、追加する月の最初の日。

    • dateに注意してください +interval 結果はtimestamp 、ここで最適です。詳細な説明:

    自動化

    CTEで日付シリーズの開始を指定できます:

    WITH t(d) AS (SELECT date '2013-02-01')  -- enter 1st of month once
    SELECT generate_series(date_trunc('week', d + interval '6 days')
                         , date_trunc('week', d + interval '1 month - 1 day')
                         , interval '1 week')::date AS day
    FROM   t
    UNION  SELECT d FROM t
    ORDER  BY 1;
    

    または、繰り返し呼び出すと便利なように、単純なSQL関数にラップします。

    CREATE OR REPLACE FUNCTION f_week_starts_this_month(date)
      RETURNS SETOF date AS
    $func$
    SELECT generate_series(date_trunc('week', $1 + interval '6 days')
                         , date_trunc('week', $1 + interval '1 month - 1 day')
                         , interval '1 week')::date AS day
    UNION
    SELECT $1
    ORDER  BY 1
    $func$  LANGUAGE sql IMMUTABLE;
    

    電話:

    SELECT * FROM f_week_starts_this_month('2013-02-01');
    

    月の最初の日の日付を渡すことになりますが、すべてので機能します。 日にち。あなたは初日と翌月のすべての月曜日です。



    1. MariaDB SYSTEM_USER()の説明

    2. mysqlタイムレコーダー

    3. 10,000メートル未満のpostgisファイルとその計算された距離に表示したい

    4. 結果テーブルでリーダーと前の違いを見つける