Tengo una columna del TIMESTAMP WITHOUT TIME ZONE
tipo y me gustaría tener ese valor predeterminado para la hora actual en UTC. Obtener la hora actual en UTC es fácil:
postgres=# select now() at time zone 'utc';
timezone
----------------------------
2013-05-17 12:52:51.337466
(1 row)
Como está usando la marca de tiempo actual para una columna:
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)
Pero eso usa la hora local. Intentar forzar eso a UTC resulta en un error de sintaxis:
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
fuente
fuente
ALTER TABLE testcase_result ADD COLUMN date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT (NOW() AT TIME ZONE "UTC") NOT NULL;
falla con:ERROR: column "UTC" does not exist
. Asegúrese de que'utc'
todo sea en minúsculas.'utc'
cadena también debe estar entre comillas simples, no entre comillas dobles.Aún otra solución:
fuente
Envuélvelo en una función:
fuente
Qué pasa
Si su otra marca de tiempo no tiene zona horaria, entonces este lanzamiento arrojará el tipo de coincidencia "marca de tiempo sin zona horaria" para la hora actual.
Sin embargo, me gustaría leer lo que otros piensan sobre esa opción. Todavía no confío en mi comprensión de estas cosas de zona horaria "con / sin".
EDITAR: Agregar el comentario de Michael Ekoka aquí porque aclara un punto importante:
fuente
Estas son 2 soluciones equivalentes:
(en el código siguiente, se debe sustituir
'UTC'
por la zona ynow()
de marca de tiempo )timestamp AT TIME ZONE zone
- SQL-estándar-conformetimezone(zone, timestamp)
- posiblemente más legibleExplicación:
'UTC'
) o como un intervalo (p. ej.,INTERVAL '-08:00'
): aquí hay una lista de todas las zonas horarias disponiblesnow()
devuelve un valor de tipo de marca de tiempo (justo lo que necesitamos) con la zona horaria predeterminada de su base de datos adjunta (por ejemplo2018-11-11T12:07:22.3+05:00
).timezone('UTC', now())
convierte nuestra hora actual (de tipo marca de tiempo con zona horaria ) en el equivalente sin zona horaria enUTC
.Por ejemplo,
SELECT timestamp with time zone '2020-03-16 15:00:00-05' AT TIME ZONE 'UTC'
volveremos2020-03-16T20:00:00Z
.Documentos: zona horaria ()
fuente
at timezone 'utc'
y eso no funcionó con mi configuración de PostgreSQL.La función ya existe: zona horaria ('UTC' :: texto, ahora ())
fuente