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

该查询部分有效,因为它返回如您所见的前两周,但它缺少从 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;

详细解释见相关答案:
Generate series of a month by week interval in Postgresql

于 2013-03-15T18:47:26.993 回答
1

您要求generate_series()从 3 月 1 日午夜开始,并在 2 周减去 1 秒后结束。

但是,在请求的时间间隔内,只能生成 2 个相隔 1 周的值。如果您将间隔仅延长1 秒generate_series()则将生成第三行,并且您的查询将按预期开始工作 - 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 回答