【问题标题】:Return number of weeks in Postgres在 Postgres 中返回周数
【发布时间】:2014-01-10 00:18:06
【问题描述】:

这是我现在使用的,它返回 beginDate 和 endDate 之间的天数

date( ' $(@endDate)') - date('$(@beginDate)') as weekNumber

如何让它返回两者之间的周数?

【问题讨论】:

  • 定义“周数”。没错。
  • 正如 Erwin 所指出的,这取决于您到底想要什么。你想要整个星期吗?周是从“beginDate”的第一天开始还是从特定的固定日期开始,所以你可以在每一边都有一个部分的一周?您是否部分报告了部分周数?等

标签: sql postgresql intervals week-number


【解决方案1】:

最简单的方法是将天数除以七,尽管这不会考虑一周的开始日期。

你可以改用这个:

extract (week from date '$(@endDate)') -extract (week from date '$(@startDate)')

这将使用 iso8601 周数。但要注意跨越数年!

【讨论】:

    【解决方案2】:

    版本 1:

    /*
    Design: 
       Week begins on day of start date
       Options:
          1) Count only whole weeks
          2) Count partial weeks on the right side (end date side)
    */
    
       select 
          sum(case when ('2013-02-08'::date - ind::date) >= 7 then 1 else 0 end) as whole_weeks,
          count(*) as partial_right
       from 
          generate_series('2013-01-01'::date /*dow=2*/,'2013-02-05'::date /*dow=2*/,'7 days') ind
    

    版本 2:

    /*
    Design: 
       Week begins on specific day of week (5 chosen in this example)   
       Options:
          1) Count only whole weeks
          2) Count partial weeks on the right side (end date side)
          3) Count partial weeks on the left side (start date side)
          4) Count partial weeks on both sides
    */
    
    select
       sum(case when days = 7 then 1 else 0 end) as whole_weeks,
       sum(case when days = 7 or max_ind = week_start then 1 else 0 end) as partial_right,
       sum(case when days = 7 or week_start < min_ind then 1 else 0 end) as partial_left,
       count(*) as partial_both_sides
    from
     (
       select
          ind - (case when dow < bow then dow + 7 - bow else dow - bow end)::int as week_start,
          count(*) as days,
          min(ind) as min_ind,
          max(ind) as max_ind
        from 
          (select 
             ind::date as ind, 
             extract(isodow from ind) as dow,
             5::int as bow 
          from 
             generate_series('2013-01-01'::date /*dow=2*/,'2013-02-08'::date /*dow=5*/,'1 day') ind
          ) inp
       group by
          week_start
     ) t
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 2019-11-13
      • 2016-03-20
      • 1970-01-01
      • 2013-01-15
      • 2022-01-02
      相关资源
      最近更新 更多