2016-12-08 8 views
1

облака кто-нибудь объяснить мне, почему кастинг метку времени к Дата в PSQL дает мне неправильное значение? У меня в БД хранятся значения времени штемпеля 2016-12-04 00: 05: 09,748000 и мое время машина находится в UTC, и тип данных в PSQL является TIMESTAMP WITH TIME ZONE. Если бы я сделал это,Psql неверная дата с временной метки

orders.completed :: Дата

это дает мне 2016-12-03. Проблема в том, что если у меня есть некоторые заказы, то функции агрегации в полночь дают мне неправильные значения. Есть ли способ решить эту проблему? Буду признателен за любую помощь!

+0

попробуйте запустить код в моем ответе (ajusting TZ для того, чтобы, конечно, иметь среднюю границу), это меняет дату? –

ответ

1

Попробуйте это:

(orders.completed::timestamp at time zone 'UTC' at time zone 'America/Los_Angeles')::date; 

Вам необходимо вставить свой часовой пояс в запросе

+0

Спасибо, это работает, но моя проблема будет в другом месте, потому что это не решило мою проблему. Агрегатные функции по-прежнему возвращают неверные значения, но в любом случае спасибо. – inle

0

Хм, я не могу воспроизвести его:

b=# set timezone to "GMT+10"; 
SET 
b=# create table edge (t timestamptz); 
CREATE TABLE 
b=# insert into edge select now(); 
INSERT 0 1 
b=# select t::date, t from edge; 
    t  |    t 
------------+------------------------------- 
2016-12-08 | 2016-12-08 00:18:30.740132-10 
(1 row) 
+0

Хм, это странно. Я проведу несколько тестов с этим: сейчас() в TIME ZONE 'GMT + 11' с результатом 2016-12-08 00: 40: 39.717069 и (сейчас() в TIME ZONE 'GMT + 11') :: дата с результатом 2016-12-07. – inle

+0

@inle, поэтому мой пример работает как предполагается? затем проверьте, не сохраните ли значение даты где-то и через 5 минут (это уже другой день) используйте значение VALUE вчера –