Função DATEADD
Incrementa um valor DATE, TIME, TIMETZ ou TIMESTAMP com um intervalo especificado.
Sintaxe
DATEADD( datepart, interval, {date|time|timetz|timestamp} )
Argumentos
- datepart
-
A parte da data (ano, mês, dia ou hora, por exemplo) sobre a qual a função atua. Para ter mais informações, consulte Partes da data para funções de data ou de timestamp.
- interval
-
Um número inteiro que especificou o intervalo (número de dias, por exemplo) a adicionar à expressão de destino. Um número inteiro negativo subtrai o intervalo.
- date|time|timetz|timestamp
-
Uma coluna DATE, TIME, TIMETZ ou TIMESTAMP ou uma expressão que converta implicitamente para DATE, TIME, TIMETZ ou TIMESTAMP A expressão DATE, TIME, TIMETZ ou TIMESTAMP deve conter a parte de data especificada.
Tipo de retorno
TIMESTAMP, TIME ou TIMETZ, dependendo do tipo de dados de entrada.
Exemplos com uma coluna DATE
O exemplo a seguir adiciona 30 dias a cada data em novembro que existe na tabela DATE.
select dateadd(day,30,caldate) as novplus30 from date where month='NOV' order by dateid; novplus30 --------------------- 2008-12-01 00:00:00 2008-12-02 00:00:00 2008-12-03 00:00:00 ... (30 rows)
O exemplo a seguir adiciona 18 meses a um valor de data literal.
select dateadd(month,18,'2008-02-28'); date_add --------------------- 2009-08-28 00:00:00 (1 row)
O nome padrão da coluna para uma função DATEADD é DATE_ADD. O timestamp padrão para um valor de data é 00:00:00
.
O exemplo a seguir adiciona 30 minutos a um valor de data que não especifica um timestamp.
select dateadd(m,30,'2008-02-28'); date_add --------------------- 2008-02-28 00:30:00 (1 row)
Você pode nomear as partes da data por completo ou abreviá-las. Neste caso, m significa minutos, não meses.
Exemplos com uma coluna TIME
O TIME_TEST da tabela a seguir tem uma coluna TIME_VAL (tipo TIME) com três valores inseridos.
select time_val from time_test; time_val --------------------- 20:00:00 00:00:00.5550 00:58:00
O exemplo a seguir adiciona 5 minutos a cada TIME_VAL na tabela TIME_TEST.
select dateadd(minute,5,time_val) as minplus5 from time_test; minplus5 --------------- 20:05:00 00:05:00.5550 01:03:00
O exemplo a seguir adiciona 8 horas a um valor de tempo literal.
select dateadd(hour, 8, time '13:24:55'); date_add --------------- 21:24:55
O exemplo a seguir mostra quando um tempo passa por 24:00:00 ou abaixo de 00:00:00.
select dateadd(hour, 12, time '13:24:55'); date_add --------------- 01:24:55
Exemplos com uma coluna TIMETZ
Os valores de saída nestes exemplos estão em UTC, que é o fuso horário padrão.
O TIMETZ_TEST da tabela de exemplo a seguir tem uma coluna TIMETZ_VAL (tipo TIMETZ) com três valores inseridos.
select timetz_val from timetz_test; timetz_val ------------------ 04:00:00+00 00:00:00.5550+00 05:58:00+00
O exemplo a seguir adiciona 5 minutos a cada TIMETZ_VAL na tabela TIMETZ_TEST.
select dateadd(minute,5,timetz_val) as minplus5_tz from timetz_test; minplus5_tz --------------- 04:05:00+00 00:05:00.5550+00 06:03:00+00
O exemplo a seguir adiciona 2 horas a um valor timetz literal.
select dateadd(hour, 2, timetz '13:24:55 PST'); date_add --------------- 23:24:55+00
Exemplos com uma coluna TIMESTAMP
Os valores de saída nestes exemplos estão em UTC, que é o fuso horário padrão.
O exemplo de tabela TIMESTAMP_TEST a seguir tem uma coluna TIMESTAMP_VAL (tipo TIMESTAMP) com três valores inseridos.
SELECT timestamp_val FROM timestamp_test; timestamp_val ------------------ 1988-05-15 10:23:31 2021-03-18 17:20:41 2023-06-02 18:11:12
O exemplo a seguir adiciona 20 anos somente aos valores de TIMESTAMP_VAL em TIMESTAMP_TEST anteriores ao ano 2000.
SELECT dateadd(year,20,timestamp_val) FROM timestamp_test WHERE timestamp_val < to_timestamp('2000-01-01 00:00:00', 'YYYY-MM-DD HH:MI:SS'); date_add --------------- 2008-05-15 10:23:31
O exemplo a seguir adiciona 5 segundos a um valor literal de carimbo de data/hora gravado sem um indicador de segundos.
SELECT dateadd(second, 5, timestamp '2001-06-06'); date_add --------------- 2001-06-06 00:00:05
Observações de uso
As funções DATEADD(month, …) e ADD_MONTHS lidam com datas que caiam no final do mês de forma diferente.
-
ADD_MONTHS: Se a data que você estiver adicionando for o último dia do mês, o resultado será sempre o último dia do mês do resultado, independentemente do tamanho do mês. Por exemplo, 30 de abril + 1 mês é o dia 31 de maio.
select add_months('2008-04-30',1); add_months --------------------- 2008-05-31 00:00:00 (1 row)
-
DATEADD: Se houver menos dias na data que você está adicionando do que no mês de resultado, o resultado será o dia correspondente do mês de resultado, não o último dia desse mês. Por exemplo, 30 de abril + 1 mês é o dia 30 de maio.
select dateadd(month,1,'2008-04-30'); date_add --------------------- 2008-05-30 00:00:00 (1 row)
A função DATEADD lida com a data de ano bissexto 02-29 de forma diferente ao usar dateadd(month, 12,…) ou dateadd(year, 1, …).
select dateadd(month,12,'2016-02-29'); date_add --------------------- 2017-02-28 00:00:00 select dateadd(year, 1, '2016-02-29'); date_add --------------------- 2017-03-01 00:00:00