Strängrepresentation av en timestamp
(=timestamp without time zone
) beror på dina lokala inställningar. Därför, för att undvika oklarheter som leder till datafel eller att Postgres hostar upp ett undantag, har du två alternativ:
1.) Använd ISO 8601-format , som fungerar på samma sätt med alla locale eller DateStyle
inställning:
'2013-08-20 14:52:49'
Du kan behöva casta strängen bokstavligt uttryckligen där datatypen inte kan härledas från kontexten, beroende på användningsfallet:
'2013-08-20 14:52:49'::timestamp
2.) Konvertera strängen till timestamp
med to_timestamp()
med ett matchande mallmönster:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')
Detta returnerar timestamptz
, med den aktuella tidszonsinställningen. Typiskt (som i ett uppdrag) tvingas typen i enlighet därmed. För timestamp
, betyder detta att tidsförskjutningen trunkeras och du får det förväntade värdet. Återigen, om måltypen inte kan härledas från sammanhanget, kan du behöva casta uttryckligen:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')::timestamp
Eftersom det helt enkelt tar bort tidsförskjutningen, resulterar det i det förväntade värdet. Eller använd AT TIME ZONE
konstruera med en tidszon som du väljer:
to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss') AT TIME ZONE 'UTC'
Medan måltidszonen är densamma som din nuvarande timezone
inställning sker ingen transformation. Annars transponeras den resulterande tidsstämpeln i enlighet därmed. Mer läsning:
- Ignorerar tidszoner helt och hållet i Rails och PostgreSQL