PostgreSQL 10 - Date/Time: -

9.9. Funciones de fecha / hora y operadores




postgresql

La Tabla 9.30 muestra las funciones disponibles para el procesamiento del valor de fecha / hora, con detalles que aparecen en las siguientes subsecciones. La Tabla 9.29 ilustra los comportamientos de los operadores aritméticos básicos ( + , * , etc.). Para funciones de formateo, refiérase a la Sección 9.8 . Debe estar familiarizado con la información de fondo sobre los tipos de datos de fecha / hora de la Sección 8.5 .

Todas las funciones y operadores descritos a continuación que toman entradas de time o timestamp vienen en dos variantes: una que toma time with time zone o timestamp with time zone , y una que toma time without time zone o timestamp without time zone . Para abreviar, estas variantes no se muestran por separado. Además, los operadores + y * vienen en pares conmutativos (por ejemplo, fecha + número entero y número entero + fecha); mostramos solo uno de cada par.

Tabla 9.29. Operadores de fecha / hora

Operador Ejemplo Resultado
+ date '2001-09-28' + integer '7' date '2001-10-05'
+ date '2001-09-28' + interval '1 hour' timestamp '2001-09-28 01:00:00'
+ date '2001-09-28' + time '03:00' timestamp '2001-09-28 03:00:00'
+ interval '1 day' + interval '1 hour' interval '1 day 01:00:00'
+ timestamp '2001-09-28 01:00' + interval '23 hours' timestamp '2001-09-29 00:00:00'
+ time '01:00' + interval '3 hours' time '04:00:00'
- - interval '23 hours' interval '-23:00:00'
- date '2001-10-01' - date '2001-09-28' integer '3' (días)
- date '2001-10-01' - integer '7' date '2001-09-24'
- date '2001-09-28' - interval '1 hour' timestamp '2001-09-27 23:00:00'
- time '05:00' - time '03:00' interval '02:00:00'
- time '05:00' - interval '2 hours' time '03:00:00'
- timestamp '2001-09-28 23:00' - interval '23 hours' timestamp '2001-09-28 00:00:00'
- interval '1 day' - interval '1 hour' interval '1 day -01:00:00'
- timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' interval '1 day 15:00:00'
* 900 * interval '1 second' interval '00:15:00'
* 21 * interval '1 day' interval '21 days'
* double precision '3.5' * interval '1 hour' interval '03:30:00'
/ interval '1 hour' / double precision '1.5' interval '00:40:00'

Tabla 9.30. Funciones de fecha / hora

Función Tipo de devolución Descripción Ejemplo Resultado
age(timestamp, timestamp) interval Reste argumentos, produciendo un resultado " simbólico " que usa años y meses, en lugar de solo días age(timestamp '2001-04-10', timestamp '1957-06-13') 43 years 9 mons 27 days
age(timestamp) interval Resta de current_date (a la medianoche) age(timestamp '1957-06-13') 43 years 8 mons 3 days
clock_timestamp() timestamp with time zone Fecha y hora actual (cambios durante la ejecución de la declaración); ver la Sección 9.9.4
current_date date Fecha actual; ver la Sección 9.9.4
current_time time with time zone Hora actual del día; ver la Sección 9.9.4
current_timestamp timestamp with time zone Fecha y hora actuales (inicio de la transacción actual); ver la Sección 9.9.4
date_part(text, timestamp) double precision Obtener subcampo (equivalente a extract ); ver la Sección 9.9.1 date_part('hour', timestamp '2001-02-16 20:38:40') 20
date_part(text, interval) double precision Obtener subcampo (equivalente a extract ); ver la Sección 9.9.1 date_part('month', interval '2 years 3 months') 3
date_trunc(text, timestamp) timestamp Truncar a la precisión especificada; ver también la Sección 9.9.2 date_trunc('hour', timestamp '2001-02-16 20:38:40') 2001-02-16 20:00:00
date_trunc(text, interval) interval Truncar a la precisión especificada; ver también la Sección 9.9.2 date_trunc('hour', interval '2 days 3 hours 40 minutes') 2 days 03:00:00
extract( field from timestamp) double precision Obtener subcampo; ver la Sección 9.9.1 extract(hour from timestamp '2001-02-16 20:38:40') 20
extract( field from interval) double precision Obtener subcampo; ver la Sección 9.9.1 extract(month from interval '2 years 3 months') 3
isfinite(date) boolean Prueba de fecha finita (no +/- infinito) isfinite(date '2001-02-16') true
isfinite(timestamp) boolean Prueba de marca de tiempo finita (no +/- infinito) isfinite(timestamp '2001-02-16 21:28:30') true
isfinite(interval) boolean Prueba para intervalo finito isfinite(interval '4 hours') true
justify_days(interval) interval Ajuste el intervalo de modo que los períodos de tiempo de 30 días se representen como meses justify_days(interval '35 days') 1 mon 5 days
justify_hours(interval) interval Ajuste el intervalo para que los períodos de 24 horas se representen como días justify_hours(interval '27 hours') 1 day 03:00:00
justify_interval(interval) interval Ajuste el intervalo usando justify_days y justify_hours , con ajustes de signo adicionales justify_interval(interval '1 mon -1 hour') 29 days 23:00:00
localtime time Hora actual del día; ver la Sección 9.9.4
localtimestamp timestamp Fecha y hora actuales (inicio de la transacción actual); ver la Sección 9.9.4
make_date( year int, month int, day int) date Crear fecha de los campos de año, mes y día make_date(2013, 7, 15) 2013-07-15
make_interval( years int DEFAULT 0, months int DEFAULT 0, weeks int DEFAULT 0, days int DEFAULT 0, hours int DEFAULT 0, mins int DEFAULT 0, secs double precision DEFAULT 0.0) interval Crear intervalo de años, meses, semanas, días, horas, minutos y segundos campos make_interval(days => 10) 10 days
make_time( hour int, min int, sec double precision) time Crear tiempo a partir de los campos de horas, minutos y segundos make_time(8, 15, 23.5) 08:15:23.5
make_timestamp( year int, month int, day int, hour int, min int, sec double precision) timestamp Crear marca de tiempo de los campos de año, mes, día, hora, minuto y segundos make_timestamp(2013, 7, 15, 8, 15, 23.5) 2013-07-15 08:15:23.5
make_timestamptz( year int, month int, day int, hour int, min int, sec double precision, [ timezone text ]) timestamp with time zone Crear marca de tiempo con zona horaria de los campos de año, mes, día, hora, minuto y segundos; si no se especifica la zona horaria, se utiliza la zona horaria actual make_timestamptz(2013, 7, 15, 8, 15, 23.5) 2013-07-15 08:15:23.5+01
now() timestamp with time zone Fecha y hora actuales (inicio de la transacción actual); ver la Sección 9.9.4
statement_timestamp() timestamp with time zone Fecha y hora actuales (inicio de la declaración actual); ver la Sección 9.9.4
timeofday() text Fecha y hora actual (como clock_timestamp , pero como cadena de text ); ver la Sección 9.9.4
transaction_timestamp() timestamp with time zone Fecha y hora actuales (inicio de la transacción actual); ver la Sección 9.9.4
to_timestamp(double precision) timestamp with time zone Convertir la época de Unix (segundos desde 1970-01-01 00: 00: 00 + 00) a la marca de tiempo to_timestamp(1284352323) 2010-09-13 04:32:03+00

Además de estas funciones, el operador SQL OVERLAPS es compatible:

(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)

Esta expresión se cumple cuando dos períodos de tiempo (definidos por sus puntos finales) se superponen, falso cuando no se superponen. Los puntos finales se pueden especificar como pares de fechas, horas o marcas de tiempo; o como una fecha, hora o sello de tiempo seguido de un intervalo. Cuando se proporciona un par de valores, el comienzo o el final se pueden escribir primero; OVERLAPS toma automáticamente el valor anterior del par como inicio. Cada período de tiempo se considera que representa el intervalo de apertura parcial <= time < end , a menos que el start y el end sean iguales, en cuyo caso representa ese instante de tiempo único. Esto significa, por ejemplo, que dos períodos de tiempo con solo un punto final en común no se superponen.

SELECT (DATE '2001-02-16', DATE '2001-12-21') OVERLAPS
       (DATE '2001-10-30', DATE '2002-10-30');
Result: true
SELECT (DATE '2001-02-16', INTERVAL '100 days') OVERLAPS
       (DATE '2001-10-30', DATE '2002-10-30');
Result: false
SELECT (DATE '2001-10-29', DATE '2001-10-30') OVERLAPS
       (DATE '2001-10-30', DATE '2001-10-31');
Result: false
SELECT (DATE '2001-10-30', DATE '2001-10-30') OVERLAPS
       (DATE '2001-10-30', DATE '2001-10-31');
Result: true

Al agregar un valor de interval a (o restar un valor de interval de) una timestamp with time zone valor de timestamp with time zone , el componente de días avanza o disminuye la fecha de la timestamp with time zone en el número de días indicado. En los cambios de horario de verano (cuando la zona horaria de la sesión se establece en un huso horario que reconoce DST), esto significa que el interval '1 day' no necesariamente equivale al interval '24 hours' . Por ejemplo, con la zona horaria de la sesión establecida en CST7CDT , la timestamp with time zone '2005-04-02 12:00-07' + interval '1 day' producirá la timestamp with time zone '2005-04-03 12:00-06' , mientras agrega interval '24 hours' a la misma timestamp with time zone inicial timestamp with time zone produce timestamp with time zone '2005-04-03 13:00-06' , ya que hay un cambio en el horario de verano en 2005-04-03 02:00 en la zona horaria CST7CDT .

Tenga en cuenta que puede haber ambigüedad en el campo de months devuelto por age porque los diferentes meses tienen diferentes números de días. El enfoque de PostgreSQL usa el mes de la primera de las dos fechas al calcular meses parciales. Por ejemplo, la age('2004-06-01', '2004-04-30') utiliza abril para rendir 1 mon 1 day , mientras que el uso de mayo rendiría 1 mon 2 days porque mayo tiene 31 días, mientras que abril tiene solo 30 .

La resta de fechas y marcas de tiempo también puede ser compleja. Una forma conceptualmente simple de realizar restas consiste en convertir cada valor en una cantidad de segundos usando EXTRACT(EPOCH FROM ...) , luego restar los resultados; esto produce la cantidad de segundos entre los dos valores. Esto se ajustará para la cantidad de días de cada mes, los cambios de zona horaria y los ajustes de horario de verano. La resta de valores de fecha y hora con el operador " - " devuelve el número de días (24 horas) y horas / minutos / segundos entre los valores, haciendo los mismos ajustes. La función de age devuelve años, meses, días y horas / minutos / segundos, realizando la resta de campo por campo y luego ajustando los valores de campo negativos. Las siguientes consultas ilustran las diferencias en estos enfoques. Los resultados de la muestra se produjeron con la timezone = 'US/Eastern' ; hay un cambio de horario de verano entre las dos fechas utilizadas:

SELECT EXTRACT(EPOCH FROM timestamptz '2013-07-01 12:00:00') -
       EXTRACT(EPOCH FROM timestamptz '2013-03-01 12:00:00');
Result: 10537200
SELECT (EXTRACT(EPOCH FROM timestamptz '2013-07-01 12:00:00') -
        EXTRACT(EPOCH FROM timestamptz '2013-03-01 12:00:00'))
        / 60 / 60 / 24;
Result: 121.958333333333
SELECT timestamptz '2013-07-01 12:00:00' - timestamptz '2013-03-01 12:00:00';
Result: 121 days 23:00:00
SELECT age(timestamptz '2013-07-01 12:00:00', timestamptz '2013-03-01 12:00:00');
Result: 4 mons

9.9.1. EXTRACT , date_part

EXTRACT(field FROM source)

La función extract recupera subcampos como el año u hora de los valores de fecha / hora. source debe ser una expresión de valor de tipo timestamp , time o interval . (Las expresiones de la date de tipo se envían a la timestamp de timestamp y, por lo tanto, se pueden usar también). field es un identificador o cadena que selecciona qué campo extraer del valor de origen. La función extract devuelve valores de tipo double precision . Los siguientes son nombres de campo válidos:

century

El siglo

SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13');
Result: 20
SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 21

El primer siglo comienza en 0001-01-01 00:00:00 AD, aunque ellos no lo sabían en ese momento. Esta definición se aplica a todos los países del calendario gregoriano. No hay siglo número 0, pasas de -1 siglo a 1 siglo. Si no está de acuerdo con esto, escriba su queja a: Papa, Catedral San Pedro de Roma, Vaticano.

day

Para los valores de timestamp , el día (del mes) campo (1 - 31); para valores de interval , el número de días

SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 16

SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute');
Result: 40
decade

El campo del año dividido por 10

SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 200
dow

El día de la semana como domingo ( 0 ) a sábado ( 6 )

SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 5

Tenga en cuenta que la numeración del día de la semana del extract difiere de la función to_char(..., 'D') .

doy

El día del año (1 - 365/366)

SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 47
epoch

Para la timestamp with time zone valores de timestamp with time zone , la cantidad de segundos desde 1970-01-01 00:00:00 UTC (puede ser negativo); para los valores de date y timestamp , la cantidad de segundos desde 1970-01-01 00:00:00 hora local; para valores de interval , la cantidad total de segundos en el intervalo

SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08');
Result: 982384720.12

SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
Result: 442800

Puede convertir un valor de época en una marca de tiempo con to_timestamp :

SELECT to_timestamp(982384720.12);
Result: 2001-02-17 04:38:40.12+00
hour

El campo de la hora (0 - 23)

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 20
isodow

El día de la semana como lunes ( 1 ) a domingo ( 7 )

SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40');
Result: 7

Esto es idéntico a dow excepto el domingo. Esto coincide con la numeración ISO 8601 del día de la semana.

isoyear

El año de numeración de la semana ISO 8601 en que cae la fecha (no aplicable a intervalos)

SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01');
Result: 2005
SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02');
Result: 2006

Cada año de numeración de semana ISO 8601 comienza con el lunes de la semana que contiene el 4 de enero, por lo que a principios de enero o finales de diciembre, el año ISO puede ser diferente al año gregoriano. Ver el campo de la week para más información.

Este campo no está disponible en versiones de PostgreSQL anteriores a 8.3.

microseconds

El campo de segundos, que incluye partes fraccionales, multiplicado por 1 000 000; tenga en cuenta que esto incluye segundos completos

SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5');
Result: 28500000
millennium

El milenio

SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 3

Los años en el 1900 están en el segundo milenio. El tercer milenio comenzó el 1 de enero de 2001.

milliseconds

El campo de segundos, que incluye partes fraccionales, multiplicado por 1000. Tenga en cuenta que esto incluye segundos completos.

SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5');
Result: 28500
minute

El campo de minutos (0 - 59)

SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 38
month

Para los valores de timestamp , el número del mes dentro del año (1 - 12); para valores de interval , el número de meses, módulo 12 (0 - 11)

SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 2

SELECT EXTRACT(MONTH FROM INTERVAL '2 years 3 months');
Result: 3

SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');
Result: 1
quarter

El trimestre del año (1 - 4) en que la fecha está

SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 1
second

El campo de segundos, que incluye partes fraccionales (0 - 59 [7] )

SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 40

SELECT EXTRACT(SECOND FROM TIME '17:12:28.5');
Result: 28.5
timezone

El desplazamiento de la zona horaria de UTC, medido en segundos. Los valores positivos corresponden a las zonas horarias al este de UTC, valores negativos a las zonas al oeste de UTC. (Técnicamente, PostgreSQL no usa UTC porque no se manejan los segundos intercalares).

timezone_hour

El componente de la hora del desplazamiento de la zona horaria

timezone_minute

El componente de minutos del desplazamiento de la zona horaria

week

El número de la semana de numeración semanal ISO 8601 del año. Por definición, las semanas ISO comienzan los lunes y la primera semana de un año contiene el 4 de enero de ese año. En otras palabras, el primer jueves de un año es en la semana 1 de ese año.

En el sistema de numeración semanal ISO, es posible que las fechas de principios de enero sean parte de la semana 52 o 53 del año anterior y que las fechas de finales de diciembre sean parte de la primera semana del año siguiente. Por ejemplo, 2005-01-01 es parte de la 53ª semana del año 2004, y 2006-01-01 forma parte de la 52ª semana del año 2005, mientras que 2012-12-31 es parte de la primera semana de 2013. Es recomienda usar el campo isoyear junto con la week para obtener resultados consistentes.

SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 7
year

El campo del año. Tenga en cuenta que no hay 0 AD , por lo que restar años BC años AD debe hacerse con cuidado.

SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 2001

Nota

Cuando el valor de entrada es +/- Infinito, extract devuelve +/- Infinito para campos que aumentan monótonamente ( epoch , julian , year , year isoyear , decade , century y millennium ). Para otros campos, se devuelve NULL. Las versiones de PostgreSQL anteriores a 9.6 regresaron a cero para todos los casos de entrada infinita.

La función de extract está principalmente destinada al procesamiento computacional. Para formatear los valores de fecha / hora para visualizar, consulte la Sección 9.8 .

La función date_part está modelada en el equivalente de Ingres tradicional al extract función estándar de SQL:

date_part('field', source)

Tenga en cuenta que aquí el parámetro de field debe ser un valor de cadena, no un nombre. Los nombres de campo válidos para date_part son los mismos que para extract .

SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
Result: 16

SELECT date_part('hour', INTERVAL '4 hours 3 minutes');
Result: 4

9.9.2. date_trunc

La función date_trunc es conceptualmente similar a la función trunc para números.

date_trunc('field', source)

source es una expresión de valor de tipo timestamp o interval . (Los valores de tipo date y time se transfieren automáticamente a la timestamp de timestamp o al interval , respectivamente.) El field selecciona a qué precisión se truncará el valor de entrada. El valor de retorno es de tipo timestamp de timestamp o interval con todos los campos que son menos significativos que el seleccionado establecido en cero (o uno, por día y mes).

Los valores válidos para el field son:

microseconds
milliseconds
second
minute
hour
day
week
month
quarter
year
decade
century
millennium

Ejemplos:

SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
Result: 2001-02-16 20:00:00

SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
Result: 2001-01-01 00:00:00

9.9.3. AT TIME ZONE

La construcción AT TIME ZONE permite conversiones de marcas de tiempo en diferentes zonas horarias. La Tabla 9.31 muestra sus variantes.

Tabla 9.31. AT TIME ZONE Variantes

Expresión Tipo de devolución Descripción
timestamp without time zone AT TIME ZONE zone timestamp with time zone Trate el sello de tiempo dado sin zona horaria como se encuentra en el huso horario especificado
timestamp with time zone AT TIME ZONE zone timestamp without time zone Convertir la marca de tiempo determinada con la zona horaria en la nueva zona horaria, sin designación de zona horaria
time with time zone AT TIME ZONE zone time with time zone Convierta el tiempo dado con la zona horaria a la nueva zona horaria

En estas expresiones, la zona de zone horaria deseada puede especificarse como una cadena de texto (por ejemplo, 'PST' ) o como un intervalo (por ejemplo, INTERVAL '-08:00' ). En el caso de texto, un nombre de zona horaria se puede especificar de cualquiera de las formas descritas en la Sección 8.5.3 .

Ejemplos (suponiendo que la zona horaria local sea PST8PDT ):

SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'MST';
Result: 2001-02-16 19:38:40-08

SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST';
Result: 2001-02-16 18:38:40

El primer ejemplo toma una marca de tiempo sin zona horaria y la interpreta como hora MST (UTC-7), que luego se convierte en PST (UTC-8) para su visualización. El segundo ejemplo toma una marca de tiempo especificada en EST (UTC-5) y la convierte a hora local en MST (UTC-7).

La timezone(zone, timestamp) función timezone(zone, timestamp) es equivalente a la timestamp AT TIME ZONE zone construcción conforme a SQL en timestamp AT TIME ZONE zone .

9.9.4. Fecha / hora actual

PostgreSQL proporciona una serie de funciones que devuelven valores relacionados con la fecha y hora actuales. Estas funciones estándar de SQL devuelven valores basados ​​en la hora de inicio de la transacción actual:

CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME(precision)
CURRENT_TIMESTAMP(precision)
LOCALTIME
LOCALTIMESTAMP
LOCALTIME(precision)
LOCALTIMESTAMP(precision)

CURRENT_TIME y CURRENT_TIMESTAMP entregan valores con zona horaria; LOCALTIME y LOCALTIMESTAMP entregan valores sin zona horaria.

CURRENT_TIME , CURRENT_TIMESTAMP , LOCALTIME y LOCALTIMESTAMP pueden tomar opcionalmente un parámetro de precisión, que hace que el resultado se redondee a esa cantidad de dígitos fraccionarios en el campo de segundos. Sin un parámetro de precisión, el resultado se otorga a la precisión total disponible.

Algunos ejemplos:

SELECT CURRENT_TIME;
Result: 14:39:53.662522-05

SELECT CURRENT_DATE;
Result: 2001-12-23

SELECT CURRENT_TIMESTAMP;
Result: 2001-12-23 14:39:53.662522-05

SELECT CURRENT_TIMESTAMP(2);
Result: 2001-12-23 14:39:53.66-05

SELECT LOCALTIMESTAMP;
Result: 2001-12-23 14:39:53.662522

Dado que estas funciones devuelven la hora de inicio de la transacción actual, sus valores no cambian durante la transacción. Esto se considera una característica: la intención es permitir que una sola transacción tenga una noción coherente del tiempo " actual " , de modo que las modificaciones múltiples dentro de la misma transacción tengan la misma marca de tiempo.

Nota

Otros sistemas de bases de datos pueden avanzar estos valores con mayor frecuencia.

PostgreSQL también proporciona funciones que devuelven la hora de inicio de la instrucción actual, así como la hora actual real en el instante en que se llama a la función. La lista completa de funciones de tiempo no estándar de SQL es:

transaction_timestamp()
statement_timestamp()
clock_timestamp()
timeofday()
now()

transaction_timestamp() es equivalente a CURRENT_TIMESTAMP , pero se llama para reflejar claramente lo que devuelve. statement_timestamp() devuelve la hora de inicio de la declaración actual (más específicamente, la hora de recepción del último mensaje de comando del cliente). statement_timestamp() y transaction_timestamp() devuelven el mismo valor durante el primer comando de una transacción, pero pueden diferir durante los comandos posteriores. clock_timestamp() devuelve la hora actual real, y por lo tanto su valor cambia incluso dentro de un solo comando SQL. timeofday() es una función histórica de PostgreSQL. Al igual que clock_timestamp() , devuelve la hora actual real, pero como una cadena de text formateada en lugar de una timestamp with time zone valor de timestamp with time zone . now() es un equivalente tradicional de PostgreSQL a transaction_timestamp() .

Todos los tipos de datos de fecha / hora también aceptan el valor literal especial now para especificar la fecha y la hora actuales (una vez más, se interpreta como la hora de inicio de la transacción). Por lo tanto, los tres siguientes arrojan el mismo resultado:

SELECT CURRENT_TIMESTAMP;
SELECT now();
SELECT TIMESTAMP 'now';  -- incorrect for use with DEFAULT

Propina

No desea utilizar el tercer formulario al especificar una cláusula DEFAULT al crear una tabla. El sistema convertirá now a una timestamp tan pronto como se analice la constante, de modo que cuando se necesite el valor predeterminado, se usará la hora de creación de la tabla. Los dos primeros formularios no se evaluarán hasta que se use el valor predeterminado, ya que son llamadas a funciones. Por lo tanto, darán el comportamiento deseado de incumplimiento al momento de la inserción de la fila.

9.9.5. Retrasando la ejecución

Las siguientes funciones están disponibles para retrasar la ejecución del proceso del servidor:

pg_sleep(seconds)
pg_sleep_for(interval)
pg_sleep_until(timestamp with time zone)

pg_sleep hace que el proceso de la sesión actual pg_sleep hasta que hayan transcurrido segundos. seconds es un valor de tipo double precision , por lo que se pueden especificar retrasos de fracción de segundo. pg_sleep_for es una función de conveniencia para tiempos de pg_sleep_for más grandes especificados como un interval . pg_sleep_until es una función de conveniencia para cuando se desea un tiempo de pg_sleep_until específico. Por ejemplo:

SELECT pg_sleep(1.5);
SELECT pg_sleep_for('5 minutes');
SELECT pg_sleep_until('tomorrow 03:00');

Nota

La resolución efectiva del intervalo de sueño es específica de la plataforma; 0.01 segundos es un valor común. El tiempo de espera será al menos tan largo como se especifique. Puede ser más largo dependiendo de factores tales como la carga del servidor. En particular, no se garantiza que pg_sleep_until se pg_sleep_until exactamente a la hora especificada, pero no se activará antes.

Advertencia

Asegúrese de que su sesión no contenga más bloqueos de los necesarios cuando llame a pg_sleep o sus variantes. De lo contrario, otras sesiones podrían tener que esperar su proceso de inactividad, ralentizando todo el sistema.

[7] 60 si el sistema operativo implementa los segundos intercalares