Я пытаюсь создать таблицу в Postgres, в которой будут храниться события, происходящие один раз в час каждый день в течение следующих нескольких лет. Поэтому я заполнил столбец, используя следующее выражение:
INSERT INTO tablename(time)
SELECT CAST('2013-01-01' AS DATE) + (n || ' hour')::INTERVAL
FROM generate_series(0, 100000) n;
В качестве типа данных для этого столбца я выбрал отметка времени с часовым поясом и надеялся, что таким образом будет автоматически учитываться переход на летнее время. (Кстати, мой часовой пояс по умолчанию — CET, поэтому это UTC+1 или UTC+2, когда применяется летнее время). В результате вышеуказанного запроса я получаю это:
- 2013-03-31 00:00:00 +01
- 2013-03-31 01:00:00 +01
- 2013-03-31 03:00:00 +02
- 2013-03-31 03:00:00 +02
- 2013-03-31 04:00:00 +02
- ...
- 2013-10-27 00:00:00 +02
- 2013-10-27 01:00:00 +02
- 2013-10-27 02:00:00 +01
- 2013-10-27 03:00:00 +01
- 2013-10-27 04:00:00 +01
- ...
Смещение относительно UTC меняется, и я ожидал, что 02:00 пропущено 31 марта, так как в этом дне всего 23 часа, но я не знаю, почему 03:00 есть дважды, тогда как 27 октября 02:00 есть только там один раз вместо двух, так как в этом дне 25 часов. Чего я хотел бы добиться, так это того, чтобы для всех лет в определенный день марта 2 часа не пропускались (я бы предпочел поставить «н. д.» или что-то еще для соответствующего значения) и что есть две записи для 3 часов в определенный день в октябре (но не в марте), так что я получу столбец следующего вида (где 1 означает час с 00:00 до 1:00, 2 для 1:00-2:00 , и т.д.):
- 2013-03-31 1 +01
- 31.03.2013 2 +01
- 31.03.2013 3 +02
- 31.03.2013 4 +02
- 2013-03-31 5 +02
- ...
- 2013-10-27 1 +02
- 27.10.2013 2 +02
- 27.10.2013 3A +02
- 27.10.2013 3B +01
- 27.10.2013 4 +01
- 2013-10-27 5 +01
- ...
Кто-нибудь знает, как это сделать? Я делаю что-то принципиально неправильно? Это просто вопрос форматирования? Должен ли я писать функцию? Любая помощь будет оценена по достоинству. Спасибо.