Грабли с переходом на зимнее время... Может, кому интересно :)

Konrad
Дата: 28.10.2003 11:41:15
Может, гуру будут смеяться (с)Schweik, но сегодня половина рабочего дня вылетела в трубу из-за банальной, по сути, вещицы :)

Есть у меня одно представление, в котором в условии WHERE имеется нечто вроде конструкции
table2.date=table1.date-interval '1 days'
. Т.е. данным выражением обеспечивается условие, что дата в таблице 2 на один день старше даты в таблице 1. Все это дело прекрасно работало вплоть до вчерашнего дня.
Вчера конце рабочего дня (данные стекаются вечером) обнаружил, что цифры, расчет которых обеспечивает данное представление, отсутствуют. Отсутствуют ТОЛЬКО за одно единственное число.
После того, как перелопатил все таблицы, которые служат источниками данных для этого представления, написания запросов, эмулирующих работу этого VIEW у меня уже опустились руки - все, вот и open source.. на свой страх и риск, что называется.. Только с одной датой не работало, остальные-то работают! А VIEW для всех ОДИН. И данные имеются, и корректны..
В конце-концов как-то сообразил попробовать явно описать типы данных таким образом, что вышестоящее выражение приобрело вид:
table2.date=(table1.date::date-interval '1 days'::interval)::date
. Пересоздаю VIEW, раздаю к нему права пользователям заново и - все заработало :)
Но суть проблемы-то не ясна.. Почему именно за 27-е октября это вылезло? Набираю в консоли:

db=# select date('2003-10-26') - interval '1 days';
?column?
------------------------

2003-10-25 00:00:00+05


И следующее:

db=# select date('2003-10-27') - interval '1 days';
?column?
------------------------

2003-10-26 01:00:00+05


Обратите внимание - есть "лишний" час, объявившийся как раз на стыке летнего и зимнего времени.
Именно этот час и не позволял определить первое выражение как дату без явного указания типа данных..

Далее все отрабатывается уже корректно, т.к. postgres оперирует значением GMT:

db=# select date('2003-10-28') - interval '1 days';
?column?
------------------------

2003-10-27 00:00:00+04


Естественно, при жесткой установке ::date весь этот аппендикс timestamp'а не фигурирует, поэтому проблем с определением вчерашней даты не возникает..