【问题标题】:Count days between dates based on multiple conditions根据多个条件计算日期之间的天数
【发布时间】:2020-10-30 08:13:22
【问题描述】:

我有一张包含日期、ID 和状态的表格。在 postgres 函数中,我需要输入 start_date 和 end_date。现在,根据这些输入的日期,使用和可用天数的计数应以 ID -> count 的形式返回。

示例表:

(ID)    (Date)        (State)
1     01-01-2020     Available
1     02-01-2020      In Use
1     05-01-2020     Available
1     06-01-2020      In Use
2     01-01-2020     Available
2     21-01-2020      In Use

假设我输入:start_date = '01-01-2020' 和 end_date = '31-01-2020'

输出应该是:

(ID)         (Usage Days)
1              29
2              11

如何计算:

  • 对于设备 1:(第 2 到第 5)= 3 天; 6 日至 31 日 = 26 天; SO 26+3=29

  • 对于设备 2:(21 日至 31 日)= 11 天

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    这对我有用。 dbfiddle

    with parms as (
      select '2020-01-01'::date as start_date,
             '2020-01-31'::date as end_date
    ), runs as (
      select u.*, 
             extract(days from coalesce(lead(ddate) over w, p.end_date + interval '1 day') - ddate) as runlength
      from parms p
      join usagelog u
        on u.ddate between p.start_date and p.end_date
    window w as (partition by id order by ddate)
    )
    select id, 
           sum(runlength) filter (where state = 'Available') as available_days,
           sum(runlength) filter (where state = 'In Use') as usage_days
      from runs
     group by id
     order by id;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 2019-09-27
      相关资源
      最近更新 更多