J'ai une colonne du TIMESTAMP WITHOUT TIME ZONE
type et j'aimerais avoir cette valeur par défaut à l'heure actuelle en UTC. Obtenir l'heure actuelle en UTC est facile:
postgres=# select now() at time zone 'utc';
timezone
----------------------------
2013-05-17 12:52:51.337466
(1 row)
Comme pour l'utilisation de l'horodatage actuel pour une colonne:
postgres=# create temporary table test(id int, ts timestamp without time zone default current_timestamp);
CREATE TABLE
postgres=# insert into test values (1) returning ts;
ts
----------------------------
2013-05-17 14:54:33.072725
(1 row)
Mais cela utilise l'heure locale. Essayer de forcer cela à UTC entraîne une erreur de syntaxe:
postgres=# create temporary table test(id int, ts timestamp without time zone default now() at time zone 'utc');
ERROR: syntax error at or near "at"
LINE 1: ...int, ts timestamp without time zone default now() at time zo...
postgresql
timezone
timestamp
Wichert Akkerman
la source
la source
ALTER TABLE testcase_result ADD COLUMN date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT (NOW() AT TIME ZONE "UTC") NOT NULL;
échoue avec:ERROR: column "UTC" does not exist
. Assurez-vous que'utc'
tout est en minuscules.'utc'
chaîne doit également être entre guillemets simples et non entre guillemets doubles.Encore une autre solution:
la source
Enveloppez-le dans une fonction:
la source
Qu'en est-il de
Si votre autre horodatage est sans fuseau horaire, cette distribution donnera le type correspondant «horodatage sans fuseau horaire» pour l'heure actuelle.
J'aimerais toutefois lire ce que les autres pensent de cette option. Je n'ai toujours pas confiance en ma compréhension de ce truc de fuseau horaire "avec / sans".
EDIT: Ajout du commentaire de Michael Ekoka ici car il clarifie un point important:
la source
Ce sont 2 solutions équivalentes:
(dans le code suivant, vous devez remplacer
'UTC'
par zone etnow()
pour l' horodatage )timestamp AT TIME ZONE zone
- Conforme à la norme SQLtimezone(zone, timestamp)
- sans doute plus lisibleExplication:
'UTC'
), soit sous forme d'intervalle (par exemple,INTERVAL '-08:00'
) - voici une liste de tous les fuseaux horaires disponiblesnow()
renvoie une valeur de type horodatage (exactement ce dont nous avons besoin) avec le fuseau horaire par défaut de votre base de données attaché (par exemple2018-11-11T12:07:22.3+05:00
).timezone('UTC', now())
transforme notre heure actuelle (de type horodatage avec fuseau horaire ) en l'équivalent sans fuseau horaire dansUTC
.Par exemple,
SELECT timestamp with time zone '2020-03-16 15:00:00-05' AT TIME ZONE 'UTC'
reviendra2020-03-16T20:00:00Z
.Docs: fuseau horaire ()
la source
at timezone 'utc'
et cela ne fonctionnait pas avec ma configuration PostgreSQL. Utilisation de lettres majuscules résolu problèmeLa fonction existe déjà: timezone ('UTC' :: text, now ())
la source