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');
月の最初の日の日付を渡すことになりますが、すべてので機能します。 日にち。あなたは初日と翌月のすべての月曜日です。