简体   繁体   English

使用generate_series更新具有正确日期范围的列

[英]Update column with correct daterange using generate_series

I have a column with incorrect dateranges (a day is missing). 我有一个列不正确的日期范围(缺少一天)。 The code to generate these dateranges was written by a previous employee and cannot be found. 生成这些日期范围的代码是由前一名员工编写的,无法找到。

The dateranges look like this, notice the missing day: 日期范围看起来像这样,注意缺少的一天:

+-------+--------+-------------------------+ 
|  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) |
+-------+--------+-------------------------+

And should look like this: 应该是这样的:

+-------------------------+ 
|          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) |
+-------------------------+ 

The code I've written to generate correct dateranges looks like this: 我为生成正确的日期范围而编写的代码如下所示:

 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; 

However, I'm having trouble trying to update the column with the correct dateranges. 但是,我在尝试使用正确的日期范围更新列时遇到问题。 I initially executed this UPDATE query on a test database I created: 我最初在我创建的测试数据库上执行了此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; 

But that is not correct, it simply assigns the first generated daterange to each row. 但这不正确,它只是将第一个生成的日期范围分配给每一行。 I want to essentially update the dateranges row-by-row since there is no other join or condition I can match the dates up to. 我想基本上逐行更新日期范围,因为没有其他连接或条件我可以匹配日期。 Any assistance in this matter is greatly appreciated. 非常感谢您对此事的任何帮助。

Your working too hard. 你的工作太辛苦了。 Just update the upper range value. 只需更新上限值即可。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM