PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment convertir une chaîne en horodatage sans fuseau horaire

Représentation sous forme de chaîne d'un timestamp (=timestamp without time zone ) dépend de vos paramètres régionaux. Par conséquent, pour éviter les ambiguïtés conduisant à des erreurs de données ou à Postgres crachant une exception, vous avez deux options :

1.) Utiliser le format ISO 8601 , qui fonctionne de la même manière avec any locale ou DateStyle réglage :

'2013-08-20 14:52:49'

Vous devrez peut-être convertir explicitement le littéral de chaîne lorsque le type de données ne peut pas être dérivé du contexte, selon le cas d'utilisation :

'2013-08-20 14:52:49'::timestamp

2.) Convertir la chaîne en timestamp en utilisant to_timestamp() avec un modèle de modèle correspondant :

to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')

Cela renvoie timestamptz , en supposant le paramètre de fuseau horaire actuel. Généralement (comme dans une affectation), le type est contraint en conséquence. Pour timestamp , cela signifie que le décalage temporel est tronqué et que vous obtenez la valeur attendue.Encore une fois, si le type cible ne peut pas être dérivé du contexte, vous devrez peut-être transtyper explicitement :

to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')::timestamp

Comme cela supprime simplement le décalage temporel, il en résulte la valeur attendue. Ou utilisez le AT TIME ZONE construire avec un fuseau horaire de votre choix :

to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss') AT TIME ZONE 'UTC'

Alors que le fuseau horaire cible est le même que votre timezone actuel réglage, aucune transformation n'a lieu. Sinon, l'horodatage résultant est transposé en conséquence. Lectures complémentaires :

  • Ignorer complètement les fuseaux horaires dans Rails et PostgreSQL