Adiciona ou subtrai um intervalo de tempo de um valor de data ou timestamp.
Sintaxe
DATEADD(DATE|DATETIME|TIMESTAMP|TIMESTAMP_NTZ <date>, BIGINT <delta>, STRING <datepart>)
Parâmetros
date (obrigatório)
Data ou timestamp a modificar. Tipos suportados: DATE, DATETIME, TIMESTAMP e TIMESTAMP_NTZ.
Na edição de tipos de dados 1.0 do MaxCompute, valores STRING no formato yyyy-mm-dd hh:mi:ss são convertidos implicitamente para DATETIME. Por exemplo, '2025-07-21 00:00:00' é tratado como um valor DATETIME.
delta (obrigatório)
Número de unidades de tempo a adicionar ou subtrair. Este parâmetro é do tipo BIGINT. Um valor positivo adiciona o intervalo; um valor negativo o subtrai. Por exemplo, para adicionar 7 dias, defina delta como 7. Para subtrair 3 meses, defina delta como -3.
Na edição de tipos de dados 1.0 do MaxCompute, valores STRING e DOUBLE são convertidos implicitamente para BIGINT.
Adicionar ou subtrair delta pode causar transporte ou empréstimo para uma unidade de tempo mais significativa. Por exemplo, adicionar 20 meses incrementa o ano. Os componentes de ano, mês, hora, minuto e segundo seguem os sistemas de base 10, base 12, base 24 e base 60, respectivamente.
datepart (obrigatório)
Unidade de tempo do intervalo. Este parâmetro deve ser uma constante STRING. Valores não constantes, formatos não suportados ou outros tipos de dados retornam erro.
|
Unidade de tempo |
Valores aceitos |
|
Ano |
|
|
Trimestre |
|
|
Mês |
|
|
Semana |
|
|
Dia |
|
|
Hora |
|
|
Minuto |
|
|
Segundo |
|
|
Milissegundo |
|
|
Microssegundo |
|
Valor de retorno
Retorna um valor do mesmo tipo do parâmetro de entrada date (DATE, DATETIME, TIMESTAMP ou TIMESTAMP_NTZ).
|
Condição |
Resultado |
|
|
Erro |
|
|
Erro |
|
|
NULL |
|
|
NULL |
Tratamento de fim de mês
Quando datepart é month (ou quarter), DATEADD preserva o valor do dia se o mês resultante tiver dias suficientes. Se o mês resultante tiver menos dias, o dia será ajustado para o último dia desse mês.
-- January 29 + 1 month: February 2005 has only 28 days, so the result is February 28.
SELECT DATEADD(DATETIME '2005-01-29 00:00:00', 1, 'mm');
-- Result: 2005-02-28 00:00:00
-- March 30 - 1 month: February 2005 has only 28 days, so the result is February 28.
SELECT DATEADD(DATETIME '2005-03-30 00:00:00', -1, 'mm');
-- Result: 2005-02-28 00:00:00
Exemplos
Efeito de cada datepart
Cada consulta aplica um datepart diferente à mesma data base:
-- Year: add 1 year
SELECT DATEADD(DATETIME '2005-02-28 00:00:00', 1, 'yyyy');
-- Result: 2006-02-28 00:00:00
-- Quarter: add 1 quarter (3 months)
SELECT DATEADD(DATE '2005-02-28', 1, 'quarter');
-- Result: 2005-05-28
-- Month: add 1 month
SELECT DATEADD(DATETIME '2005-02-28 00:00:00', 1, 'mm');
-- Result: 2005-03-28 00:00:00
-- Week: add 2 weeks (14 days)
SELECT DATEADD(DATETIME '2005-02-28 00:00:00', 2, 'week');
-- Result: 2005-03-14 00:00:00
-- Day: add 1 day
SELECT DATEADD(DATETIME '2005-02-28 00:00:00', 1, 'dd');
-- Result: 2005-03-01 00:00:00
-- Hour: subtract 3 hours
SELECT DATEADD(DATETIME '2005-03-30 05:24:00', -3, 'hh');
-- Result: 2005-03-30 02:24:00
-- Minute: subtract 30 minutes
SELECT DATEADD(DATETIME '2005-03-30 05:24:00', -30, 'mi');
-- Result: 2005-03-30 04:54:00
-- Second: subtract 30 seconds
SELECT DATEADD(DATETIME '2005-03-30 05:24:00', -30, 'ss');
-- Result: 2005-03-30 05:23:30
-- Millisecond: add 1000 milliseconds (1 second) to a TIMESTAMP_NTZ value
SELECT DATEADD(TIMESTAMP_NTZ '2005-02-28 00:00:00.123456', 1000, 'ff3');
-- Result: 2005-02-28 00:00:01.123456
-- Microsecond: add 1000 microseconds to a TIMESTAMP value
SELECT DATEADD(TIMESTAMP '2005-02-28 00:00:00.123456', 1000, 'ff6');
-- Result: 2005-02-28 00:00:00.124456
Subtrair um dia
SELECT DATEADD(DATETIME '2005-02-28 00:00:00', -1, 'dd');
-- Result: 2005-02-27 00:00:00
Estouro de mês entre anos
Adicionar 20 meses causa estouro do mês e incremento do ano:
SELECT DATEADD(DATETIME '2005-02-28 00:00:00', 20, 'mm');
-- Result: 2006-10-28 00:00:00
Adicionar 1 mês a um valor DATE
SELECT DATEADD(DATE '2005-02-18', 1, 'mm');
-- Result: 2005-03-18
Preservar precisão de subsegundos com TIMESTAMP
SELECT DATEADD(TIMESTAMP '2005-02-28 00:00:00.123', 14, 'day');
-- Result: 2005-03-14 00:00:00.123
Datas relativas com GETDATE
Use DATEADD com GETDATE para calcular datas relativas ao horário atual. Por exemplo, DATEADD(GETDATE(), -1, 'dd') retorna a data de ontem.
-- Assuming the current time is 2020-11-17 16:31:44
SELECT DATEADD(GETDATE(), -1, 'dd');
-- Result: 2020-11-16 16:31:44
Datepart NULL retorna NULL
SELECT DATEADD(DATE '2005-02-18', 1, NULL);
-- Result: NULL
Comportamento da edição de tipos de dados
Edição de tipos de dados MaxCompute 2.0
Se date não for DATE, DATETIME, TIMESTAMP ou TIMESTAMP_NTZ, converta-o explicitamente com cast. Caso contrário, ocorrerá um erro.
SELECT DATEADD(CAST('2005-03-30 00:00:00' AS datetime), -1, 'mm');
-- Result:
-- +------------+
-- | _c0 |
-- +------------+
-- | 2005-02-28 00:00:00 |
-- +------------+
Para ativar a edição de tipos de dados 2.0, envie o seguinte comando SET junto com a instrução SQL:
set odps.sql.type.system.odps2=true;
SELECT DATEADD(TIMESTAMP '2005-02-18 00:00:00', 1, 'mm');
-- Result: 2005-03-18 00:00:00.0
Edição de tipos de dados MaxCompute 1.0
Valores STRING no formato yyyy-mm-dd hh:mi:ss são convertidos implicitamente para DATETIME. Uma STRING que não corresponda a esse formato retorna NULL.
-- Set the data type edition to 1.0.
SET odps.sql.type.system.odps2=false;
SET odps.sql.hive.compatible=false;
-- This STRING does not match the yyyy-mm-dd hh:mi:ss format, so NULL is returned.
SELECT DATEADD('2021-08-27',1,'dd');
-- This STRING matches the format and is implicitly converted to DATETIME.
SELECT DATEADD('2005-02-28 00:00:00', 1000000000, 'ff6');
-- Result: 2005-02-28 00:16:40
Funções relacionadas
DATEADD é uma função de data. Para outras funções de cálculo e conversão de datas, consulte Funções de data.