【问题标题】:Get partial weeks when generating series in postgresql在 postgresql 中生成系列时获得部分周
【发布时间】:2013-03-03 16:31:37
【问题描述】:

我正在尝试按周生成一系列日期,从 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 日的那一周。有没有办法获得最后一周,即使它还没有结束?

【问题讨论】:

    标签: sql postgresql postgresql-9.1 generate-series


    【解决方案1】:

    更快:

    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

    【讨论】:

      【解决方案2】:

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

      但是,在请求的时间间隔内,只能生成 2 个相隔 1 周的值。如果您将时间间隔延长 1 秒,那么generate_series() 将生成第 3 行,您的查询将按预期开始工作 - SQLFiddle demo

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-25
        • 1970-01-01
        • 1970-01-01
        • 2019-04-13
        • 2012-01-29
        • 2021-03-31
        • 2017-02-08
        • 2016-12-01
        相关资源
        最近更新 更多