[英]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.