Как получить уникальный диапазон дат в PostgreSQL? - PullRequest
0 голосов
/ 14 декабря 2018

Вот мои строки данных:

       start_dte        |        end_dte
------------------------+------------------------
 2018-08-01 00:00:00+00 | 2018-08-05 00:00:00+00
 2018-08-03 00:00:00+00 | 2018-08-05 00:00:00+00
 2018-08-09 00:00:00+00 | 2018-08-10 00:00:00+00
(3 rows)

Я хочу получить такой результат:

  [
    '2018-08-01',
    '2018-08-02',
    '2018-08-03',
    '2018-08-04',
    '2018-08-05',
    '2018-08-09',
    '2018-08-10',
  ]

Как я могу сделать это, используя SQL?спасибо.

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Это может быть решением:

select 
  distinct generate_series(start_date, end_date, '1 day'::interval)::date 
from 
  my_table
order by 
  generate_series asc;

Вывод:

      generate_series  
 ------------------------  
"2018-08-01"  
"2018-08-02"  
"2018-08-03"  
"2018-08-04"  
"2018-08-05"  
"2018-08-09"  
"2018-08-10"  
0 голосов
/ 14 декабря 2018

Вы можете построить серию дат, используя generate_series, а затем четко выбрать все значения из этой серии, которые находятся между начальной и конечной датами в основной таблице:

CREATE TABLE my_data (
  start_date DATE,
  end_date DATE
 );
 INSERT INTO my_data (start_date, end_date) VALUES
 ('2018-08-01 00:00:00+00', '2018-08-05 00:00:00+00'),
 ('2018-08-03 00:00:00+00', '2018-08-05 00:00:00+00'),
 ('2018-08-09 00:00:00+00', '2018-08-10 00:00:00+00');

SELECT DISTINCT all_dates.dates
FROM (
  SELECT dates.d AS dates
  FROM generate_series(
    (SELECT MIN(start_date) FROM my_data),
    (SELECT MAX(end_date) FROM my_data),
    '1 day'::interval
  ) AS dates(d)
) AS all_dates
INNER JOIN my_data
    ON all_dates.dates BETWEEN my_data.start_date AND my_data.end_date
ORDER BY all_dates.dates;

Вотскрипка

0 голосов
/ 14 декабря 2018

Я нашел способ, но не знаю, лучший ли это или нет.

Вот мое решение:

select 
  distinct generate_series 
from 
  results, 
  generate_series(results.start_dte, results.end_dte, '1 day'::interval) 
order by generate_series asc;

вывод:

    generate_series
------------------------
 2018-08-01 00:00:00+00
 2018-08-02 00:00:00+00
 2018-08-03 00:00:00+00
 2018-08-04 00:00:00+00
 2018-08-05 00:00:00+00
 2018-08-09 00:00:00+00
 2018-08-10 00:00:00+00
(7 rows)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...