J'ai une colonne added_at
De type timestamp without time zone
. Je veux que sa valeur par défaut soit la date et l'heure actuelles, mais sans fuseau horaire. La fonction now()
renvoie également un fuseau horaire.
Comment puis-je résoudre ce problème?
SELECT now()::timestamp
C'est tout. La conversion convertit l'horodatage en horodatage actuel de votre fuseau horaire. C'est également ainsi que la fonction SQL standard LOCALTIMESTAMP
est implémentée dans Postgres.
Si vous ne travaillez pas dans plusieurs fuseaux horaires, cela fonctionne parfaitement. Sinon passez à timestamptz
pour added_at
. La différence?
Eh bien, vous pouvez faire quelque chose comme:
SELECT now() AT TIME ZONE current_setting('TimeZone');
SELECT now() AT TIME ZONE 'Europe/Paris';
SELECT now() AT TIME ZONE 'UTC';
Vous ne savez pas comment cela a un sens pour une colonne "added_at". Vous voulez presque toujours un horodatage absolu (horodatage avec fuseau horaire) et non flottant.
Modifier répondant aux points ci-dessous:
Oui, vous devez utiliser l'horodatage avec fuseau horaire (heure absolue) à moins que vous n'ayez une bonne raison de ne pas le faire.
Le fuseau horaire du client est donné par SHOW TimeZone
Ou current_setting(...)
comme indiqué ci-dessus.
Prenez le temps de parcourir les manuels - ils couvrent tout cela très bien.
CURRENT_TIME et CURRENT_TIMESTAMP fournissent des valeurs avec le fuseau horaire; LOCALTIME et LOCALTIMESTAMP fournissent des valeurs sans fuseau horaire.