Обновите столбец с правильным диапазоном дат, используя generate_series - PullRequest
0 голосов
/ 21 июня 2019

У меня есть столбец с неправильными датами (день пропущен). Код чтобы сгенерировать эти даты были написаны предыдущим сотрудником и не может быть найден.

Дата выглядит следующим образом, обратите внимание на отсутствующий день:

+-------+--------+-------------------------+ 
|  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 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 голосов
/ 22 июня 2019

Ты слишком много работаешь.Просто обновите верхнее значение диапазона.

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