Ciąg znaków reprezentujący timestamp
(=timestamp without time zone
) zależy od ustawień regionalnych. Dlatego, aby uniknąć niejasności prowadzących do błędów danych lub wyrzucenia przez Postgresa wyjątku, masz dwie możliwości:
1.) Użyj formatu ISO 8601 , który działa tak samo z dowolnym lokalizacja lub DateStyle
ustawienie:
'2013-08-20 14:52:49'
Może zaistnieć potrzeba jawnego rzutowania literału ciągu, gdy typ danych nie może być wyprowadzony z kontekstu, w zależności od przypadku użycia:
'2013-08-20 14:52:49'::timestamp
2.) Konwertuj ciąg na timestamp
używając to_timestamp()
z pasującym wzorem szablonu:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')
Zwraca timestamptz
, zakładając bieżące ustawienie strefy czasowej. Zazwyczaj (jak w przydziale) typ jest odpowiednio wymuszony. Dla timestamp
, oznacza to, że przesunięcie czasowe jest obcinane i otrzymujesz oczekiwaną wartość. Ponownie, jeśli typu docelowego nie można wyprowadzić z kontekstu, może być konieczne jawne rzutowanie:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')::timestamp
Ponieważ to po prostu usuwa przesunięcie czasu, daje oczekiwaną wartość. Lub użyj AT TIME ZONE
konstrukcja z wybraną strefą czasową:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss') AT TIME ZONE 'UTC'
Podczas gdy docelowa strefa czasowa jest taka sama jak Twoja aktualna timezone
ustawienie, żadna transformacja nie ma miejsca. W przeciwnym razie wynikowy znacznik czasu jest odpowiednio transponowany. Dalsza lektura:
- Całkowite ignorowanie stref czasowych w Rails i PostgreSQL