Низово представяне на timestamp
(=timestamp without time zone
) зависи от настройките ви за локал. Следователно, за да избегнете неясноти, водещи до грешки в данните или Postgres до изкашване на изключение, имате две възможности:
1.) Използвайте формат ISO 8601 , който работи по същия начин с всяко локал или DateStyle
настройка:
'2013-08-20 14:52:49'
Може да се наложи да изведете изрично низовия литерал, когато типът данни не може да бъде извлечен от контекста, в зависимост от случая на употреба:
'2013-08-20 14:52:49'::timestamp
2.) Преобразувайте низа в timestamp
използвайки to_timestamp()
със съответстващ шаблон на шаблон:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')
Това връща timestamptz
, като се приеме текущата настройка на часовата зона. Обикновено (като при присвояване) типът се принуждава съответно. За timestamp
, това означава, че отместването на времето е съкратено и получавате очакваната стойност. Отново, ако целевият тип не може да бъде извлечен от контекста, може да се наложи да предадете изрично:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')::timestamp
Тъй като това просто премахва изместването на времето, това води до очакваната стойност. Или използвайте AT TIME ZONE
конструирайте с часова зона по ваш избор:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss') AT TIME ZONE 'UTC'
Докато целевата часова зона е същата като текущата ви timezone
настройка, не се извършва трансформация. В противен случай получената времева марка се транспонира съответно. Допълнително четене:
- Изцяло игнориране на часовите зони в Rails и PostgreSQL