HOWTO · PostgreSQL
Alternativas a DATEADD() en PostgreSQL
Este artículo analiza las alternativas a DATEADD() en PostgreSQL.
En esta página
PostgreSQL no utiliza la sintaxis DATEADD() de SQL Server. Para sumar un número entero de días, súmelo a un valor date, como en manufacture_date + expires_in. Para unidades del calendario, como meses o años, use INTERVAL; por ejemplo, date '2022-08-24' + INTERVAL '2 months'. La primera expresión devuelve un valor date; al sumar un intervalo a una fecha, el resultado es una marca de tiempo sin zona horaria.
La función DATEADD() en SQL
Una tabla de productos puede almacenar una fecha de fabricación y un número entero de días hasta el vencimiento. Por ejemplo, una fila podría contener manufacture_date = DATE '2022-08-24' y expires_in = 10. El objetivo es calcular la fecha de vencimiento a partir de esos dos valores.
DATEADD() es la función de SQL Server que se suele usar para esta tarea. Su forma en SQL Server es DATEADD(day, 10, '2022-08-24'): el primer argumento indica una parte de la fecha, el segundo especifica la cantidad y el tercero es la fecha inicial. Esta sintaxis sirve de referencia para quienes vienen de SQL Server; no es una consulta de PostgreSQL. PostgreSQL expresa las operaciones aritméticas con fechas mediante operadores e intervalos.
La distinción importa porque «sumar días» y «sumar un mes del calendario» son operaciones distintas. Una cantidad de días representa un número fijo de días naturales. La cantidad de días de un mes varía, por lo que convertir meses en una cantidad fija de días puede dar una fecha incorrecta. Elija la forma de PostgreSQL que corresponda a la unidad que necesita.
Use los operadores + y - como alternativa a DATEADD() en PostgreSQL
Para calcular desplazamientos en días, PostgreSQL permite sumar directamente un entero a un valor date. La expresión DATE '2022-08-24' + 10 calcula la fecha de diez días después. Para restar días, use DATE '2022-09-03' - 10 o sume un entero negativo, como en DATE '2022-09-03' + (-10). Estas son expresiones de fecha: el resultado sigue siendo un valor date y no incluye una hora.
Este método conciso resulta útil cuando el desplazamiento se expresa en días, incluso si procede de una columna entera como expires_in. Por ejemplo, manufacture_date + expires_in calcula la fecha de vencimiento para cada fila de productos. Asegúrese de que el valor almacenado represente días: sumar un entero a una fecha no significa sumar meses ni años. Si la cantidad es un parámetro, use un tipo compatible con la aritmética de enteros o conviértalo a entero cuando corresponda.
El siguiente ejemplo en Python usa la misma fecha de fabricación y la cantidad de días almacenada para calcular la fecha de vencimiento:
from datetime import date, timedelta
manufacture_date = date(2022, 8, 24)
expires_in = 10
expiration_date = manufacture_date + timedelta(days=expires_in)
print(expiration_date.isoformat())
2022-09-03
Este ejemplo en Python ilustra el cálculo de la fecha; no ejecuta SQL de PostgreSQL. En una consulta de PostgreSQL, use la expresión de fecha mostrada arriba.
Use un intervalo cuando el cálculo se exprese en meses, años o semanas del calendario, o en una combinación de unidades. Así, la expresión deja clara la unidad deseada y evita tratar todos los meses como si tuvieran una cantidad fija de días.
Use el tipo de datos INTERVAL como alternativa a DATEADD() en PostgreSQL
Un INTERVAL representa un período de tiempo. Súmelo a una fecha para expresar operaciones basadas en el calendario: DATE '2022-08-24' + INTERVAL '10 days', DATE '2022-08-24' + INTERVAL '2 months' o DATE '2022-08-24' + INTERVAL '1 year'. También se aceptan unidades de semana, como en DATE '2022-08-24' + INTERVAL '1 week'. PostgreSQL permite usar los nombres de las unidades en singular o plural en los literales de intervalo.
Un intervalo puede combinar unidades, por ejemplo, INTERVAL '1 week 2 days'. Esto resulta útil cuando el desplazamiento consta de varios componentes del calendario. El intervalo también puede incluir horas, minutos y segundos. Al sumar un intervalo a un valor date, PostgreSQL devuelve una marca de tiempo sin zona horaria; por eso, el valor mostrado incluye una hora, normalmente la medianoche. Si después la aplicación necesita una fecha, convierta el resultado a date de forma explícita.
Las unidades del calendario siguen la aritmética del calendario, no una conversión a una cantidad fija de días. Al sumar un mes a una fecha cercana al final de un mes largo, el resultado puede ser el último día válido del mes siguiente. Por tanto, puede diferir del resultado de sumar una cantidad fija de días. Pruebe la expresión con fechas representativas de los datos y elija meses o días según la regla de negocio.
Para el ejemplo de productos, multiplique la cantidad de días almacenada por un intervalo de un día: manufacture_date + expires_in * INTERVAL '1 day'. Esto funciona fila por fila y devuelve una marca de tiempo porque la expresión incluye el intervalo. Si necesita un resultado de tipo fecha, use (manufacture_date + expires_in * INTERVAL '1 day')::date. Para una cantidad de meses almacenada, use el mismo patrón con INTERVAL '1 month'; elija la unidad de intervalo que corresponda al significado de la columna.
Los ejemplos de PostgreSQL de este artículo se presentan como expresiones SQL, pero el entorno de ejecución configurado para el artículo no ejecuta instrucciones de PostgreSQL. Considérelos ejemplos de SQL no ejecutados y ejecútelos en su base de datos de PostgreSQL. DATEADD() aparece únicamente para explicar su equivalente en SQL Server; en las consultas de PostgreSQL, use las formas con +, - e INTERVAL.