Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Грабли с переходом на зимнее время... Может, кому интересно :) / 1 сообщений из 1, страница 1 из 1
28.10.2003, 11:41
    #32307178
Konrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Грабли с переходом на зимнее время... Может, кому интересно :)
Может, гуру будут смеяться (с)Schweik, но сегодня половина рабочего дня вылетела в трубу из-за банальной, по сути, вещицы :)

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


И следующее:
Код: plaintext
1.
2.
3.
4.
5.
db=# select date('2003-10-27') - interval '1 days';
        ?column?
 ------------------------
 
  2003 - 10 - 26   01 : 00 : 00 + 05 


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

Далее все отрабатывается уже корректно, т.к. postgres оперирует значением GMT:
Код: plaintext
1.
2.
3.
4.
5.
db=# select date('2003-10-28') - interval '1 days';
        ?column?
 ------------------------
 
  2003 - 10 - 27   00 : 00 : 00 + 04 


Естественно, при жесткой установке ::date весь этот аппендикс timestamp'а не фигурирует, поэтому проблем с определением вчерашней даты не возникает..
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Грабли с переходом на зимнее время... Может, кому интересно :) / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]