Вставка нескольких дат в PostgreSQL - PullRequest
0 голосов
/ 03 мая 2020

Привет. Я хотел бы спросить, можно ли вводить даты с 01-01-2020 по 04-15-2020. В настоящее время у меня есть этот код, чтобы повторять или продолжать цикл для каждого дня с 00:00:00 до 23: 00: 00.

    INSERT INTO dashboard.availability(terminal_id, availability_date, availability_time)
    select td.terminal_id, td.down_date, (hh * interval '1 hour')::time
     from (select distinct terminal_id, down_date
      from dashboard.down_event
     ) td cross join
     generate_series(0, 23) gs(hh);

Но могу ли я сделать то же самое для цикла дат каждый день до даты достижения 2020-04-15?

Например:

terminal_id            availability_time     availability_date
   _____________     ___________________   _____________________
    012345678             00:00:00             2020-01-01
    012345678             01:00:00             2020-01-01
    012345678             02:00:00             2020-01-01
    012345678             03:00:00             2020-01-01
.
.
.  
   012345678             00:00:00               2020-04-15

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Это то, что вы хотите?

insert into dashboard.availability(terminal_id, availability_date, availability_time)
select t.terminal_id, x.ts::date, x.ts::time
from (select distinct terminal_id from dashboard.down_event) t
cross join generate_series(date '2020-01-01', date '2020-04-15', interval '1 hour') x(ts)

Для каждого terminal_id в таблице dashboard.down_event это генерирует одну строку в час между 1 января и 15 апреля. Результаты вставляются в целевую таблицу, сохраняя компоненты даты и времени в отдельных столбцах.

Примечание: хранить данные и временные компоненты метки времени в разных столбцах обычно не очень хорошая идея; это делает вещи более сложными и менее эффективными, когда вам действительно необходим доступ к значению метки времени (что происходит рано или поздно).

1 голос
/ 03 мая 2020

Почему бы просто не повторяться по часам за весь период времени?

select td.terminal_id, gs.down_date
from (select distinct terminal_id
      from dashboard.down_event
     ) td cross join
     generate_series('2020-01-01'::timestamp, '2020-04-15'::timestamp, interval '1 hour) gs(down_date);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...