使用generate_series

时间:2019-06-21 19:15:10

标签: postgresql generate-series

我有一列的日期范围不正确(缺少一天)。代码 生成这些日期范围是由前雇员编写的, 找不到。

日期范围如下所示,请注意缺少的日期:

+-------+--------+-------------------------+ 
|  id   | client |       date_range        |
+-------+--------+-------------------------+ 
| 12885 |     30 | [2016-01-07,2016-01-13) | 
| 12886 |     30 | [2016-01-14,2016-01-20) |
| 12887 |     30 | [2016-01-21,2016-01-27) | 
| 12888 |     30 | [2016-01-28,2016-02-03) | 
| 12889 |     30 | [2016-02-04,2016-02-10) |
| 12890 |     30 | [2016-02-11,2016-02-17) | 
| 12891 |     30 | [2016-02-18,2016-02-24) |
+-------+--------+-------------------------+

应该看起来像这样:

+-------------------------+ 
|          range          |
+-------------------------+ 
| [2016-01-07,2016-01-14) | 
| [2016-01-14,2016-01-21) | 
| [2016-01-21,2016-01-28) | 
| [2016-01-28,2016-02-04) | 
| [2016-02-04,2016-02-11) | 
| [2016-02-11,2016-02-18) | 
| [2016-02-18,2016-02-25) | 
| [2016-02-25,2016-03-03) |
+-------------------------+ 

我编写的用于生成正确日期范围的代码如下:

 create or replace function generate_date_series(startsOn date, endsOn date, frequency interval)
 returns setof date as $$
 select (startsOn + (frequency * count))::date
 from (
   select (row_number() over ()) - 1 as count
   from generate_series(startsOn, endsOn, frequency)
 ) series
 $$ language sql immutable;

 select DATERANGE(
   generate_date_series(
     '2016-01-07'::date, '2024-11-07'::date, interval '7days'
   )::date,
   generate_date_series(
     '2016-01-14'::date, '2024-11-13'::date, interval '7days'
   )::date
 ) as range; 

但是,我无法尝试使用 正确的日期范围。我最初在测试中执行了此UPDATE查询 我创建的数据库:

update factored_daterange set date_range = dt.range from (  
 select daterange(
     generate_date_series(
       '2016-01-07'::date, '2024-11-07'::date, interval '7days'
     )::date,
     generate_date_series(
       '2016-01-14'::date, '2024-11-14'::date, interval '7days'
     )::date   ) as range ) dt where client_id=30; 

但这是不正确的,它只是分配第一个生成的  日期范围到每一行。我想本质上更新日期范围  逐行,因为没有其他联接或条件,我可以匹配  直到。非常感谢在此问题上提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

您的工作太辛苦了。只需更新上限值。

update your_table_name
   set date_range = daterange(lower(date_range),(upper(date_range) + interval '1 day')::date) ;