代码之家  ›  专栏  ›  技术社区  ›  Slim

如何在postgresql中使用lead函数组合日期

  •  0
  • Slim  · 技术社区  · 6 年前

    我用的是 generate_series 函数提取 start_date end_date 我试着用 daterange . 我写了这个问题:

         with a as(
    select d.day::date as day from (select * from generate_series('2018-08-22'::timestamp, '2019-07-12'::timestamp, 
    concat(greatest(date_part('days','2019-07-12'::timestamp - '2018-08-22'::timestamp)/8,1), ' day')::interval)) as d(day))
    select daterange(day,(lead(day) over (order by day) - interval '1 day')::date,'[]')
    FROM a
    

    我得到了这些结果:

    "[2018-08-22,2018-10-01)"
    "[2018-10-01,2018-11-11)"
    "[2018-11-11,2018-12-21)"
    "[2018-12-21,2019-01-31)"
    "[2019-01-31,2019-03-12)"
    "[2019-03-12,2019-04-22)"
    "[2019-04-22,2019-06-01)"
    "[2019-06-01,2019-07-12)"
    "[2019-07-12,)"
    

    我不想显示最后一行 "[2019-07-12,)" . 如何管理查询以不显示包含 Infinity 价值。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    我会移动 lead() 进入CTE并使用基于此的逻辑:

    with dr as (
          select gs.day::date as day, lead(gs.day) over (order by day) as next_day
          from generate_series('2018-08-22'::timestamp, '2019-07-12'::timestamp, 
                               concat(greatest(date_part('days','2019-07-12'::timestamp - '2018-08-22'::timestamp)/8,1), ' day')::interval
                              ) gs(day)
         )
    select daterange(day, (next_day - interval '1 day')::date)
    from dr
    where next_day is not null