web-dev-qa-db-fra.com

Now () sans fuseau horaire

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?

56
アレックス
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?

63
Erwin Brandstetter

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:

  1. Oui, vous devez utiliser l'horodatage avec fuseau horaire (heure absolue) à moins que vous n'ayez une bonne raison de ne pas le faire.

  2. 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.

35
Richard Huxton

"Date/heure actuelles" :

CURRENT_TIME et CURRENT_TIMESTAMP fournissent des valeurs avec le fuseau horaire; LOCALTIME et LOCALTIMESTAMP fournissent des valeurs sans fuseau horaire.

17
Milen A. Radev