Todos os produtos
Search
Central de documentação

MaxCompute:DATEADD

Última atualização: Jun 26, 2026

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.

Nota

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

year, yyyy

Trimestre

quarter, q

Mês

month, mon, mm

Semana

week

Dia

day, dd

Hora

hour, hh

Minuto

mi

Segundo

ss

Milissegundo

ff3

Microssegundo

ff6

Valor de retorno

Retorna um valor do mesmo tipo do parâmetro de entrada date (DATE, DATETIME, TIMESTAMP ou TIMESTAMP_NTZ).

Condição

Resultado

date não é DATE, DATETIME, TIMESTAMP ou TIMESTAMP_NTZ

Erro

date é NULL

Erro

delta é NULL

NULL

datepart é 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.