1

2013 年 3 月 1 日 00:00:00 から 2013 年 3 月 14 日 23:59:59 までの一連の日付を週単位で生成しようとしています。今までのクエリは次のようになります

SELECT GREATEST(date_trunc('week', dates.d), 
                date_trunc('month',dates.d)) as start
FROM generate_series(to_timestamp(1362096000),
                     to_timestamp(1363305599), '1 week') as dates(d)

出力:

         start
------------------------
 2013-03-01 00:00:00+00
 2013-03-04 00:00:00+00

ご覧のとおり、最初の 2 週間は返されますが、2013 年 3 月 11 日から 2013 年 3 月 14 日までの週が欠落しているため、クエリは部分的に機能します。終了していなくても最後の週を取得する方法はありますか?

4

2 に答える 2

3

もっと早く:

SELECT generate_series(date_trunc('week', '2013-03-01'::date + 6)
                      ,date_trunc('week', '2013-03-14'::date)
                     ,'1 week')::date AS day
UNION  SELECT '2013-03-01'::date
ORDER  BY 1;

詳細な説明については、関連する回答を参照してください:
Postgresql で週間隔ごとに月のシリーズを生成する

于 2013-03-15T18:47:26.993 に答える
1

generate_series()3 月 1 日の午前 0 時に開始し、ちょうど 2 週間マイナス 1 秒で終了するように依頼します。

ただし、要求された間隔では、正確に 1 週​​間離れた 2 つの値しか生成できません。間隔を1 秒だけ延長すると、generate_series()3 行目が生成され、クエリが期待どおりに機能し始めます - SQLFiddle デモ:

SELECT GREATEST(
    date_trunc('week', dates.d), 
    date_trunc('month',dates.d)) as start
FROM generate_series(
    to_timestamp(1362096000),
    to_timestamp(1363305599+1), '1 week') as dates(d)
于 2013-03-15T06:29:04.790 に答える