- Categorias:
DATEDIFF¶
Calcula a diferença entre duas expressões de data, hora ou carimbo de data/hora com base na parte de data ou hora solicitada. A função retorna o resultado da subtração do segundo argumento do terceiro argumento.
O sinal de menos (-
) também pode ser usado para subtrair datas.
- Consulte também:
Sintaxe¶
Para DATEDIFF
DATEDIFF( <date_or_time_part>, <date_or_time_expr1>, <date_or_time_expr2> )
Para sinal de menos
<date_expr2> - <date_expr1>
Argumentos¶
Para DATEDIFF:
date_or_time_part
A unidade de tempo. Deve ser um dos valores listados em Partes de data e hora com suporte (por exemplo,
month
). O valor pode ser uma cadeia de caracteres literal ou pode não estar entre aspas (por exemplo,'month'
oumonth
).date_or_time_expr1
,date_or_time_expr2
Os valores a serem comparados. Deve ser uma data, uma hora, um carimbo de data/hora ou uma expressão que possa ser avaliada como uma data, uma hora ou um carimbo de data/hora. O valor
date_or_time_expr1
é subtraído dedate_or_time_expr2
.
Para sinal de menos:
date_expr1
,date_expr2
Os valores a serem comparados. Deve ser uma data ou uma expressão que possa ser avaliada como uma data. O valor
date_expr1
é subtraído dedate_expr2
.
Retornos¶
Para DATEDIFF:
Retorna um número inteiro representando a diferença de número de unidades (segundos, dias etc.) entre date_or_time_expr2
e date_or_time_expr1
.
Para sinal de menos:
Retorna um número inteiro representando o número de dias de diferença entre date_expr2
e date_expr1
. (As unidades são sempre dias).
Notas de uso¶
Para ambos DATEDIFF e sinal de menos:
Os valores de saída podem ser negativos, por exemplo, -12 dias.
Para DATEDIFF:
date_or_time_expr1
edate_or_time_expr2
podem ser uma data, hora ou carimbo de data/hora.A função oferece suporte a unidades de anos, trimestres, meses, semanas, dias, horas, minutos, segundos, milissegundos, microssegundos e nanossegundos.
date_or_time_part
deve ser um dos valores listados em Partes de data e hora com suporte.Se
date_or_time_part
forweek
(ou qualquer uma de suas variações), a saída é controlada pelo parâmetro de sessão WEEK_START. Para obter mais detalhes, incluindo exemplos, consulte Semanas de calendário e dias úteis.A unidade (por exemplo,
month
) usada para calcular a diferença determina quais partes do campo DATE, TIME ou TIMESTAMP são usadas para determinar o resultado e assim determinar a precisão do resultado.Unidades menores não são utilizadas, portanto, os valores não são arredondados. Por exemplo, mesmo que a diferença entre 1.º de janeiro de 2021 e 28 de fevereiro de 2021 esteja mais próxima de dois meses do que de um mês, o seguinte retorna um mês:
DATEDIFF(month, '2021-01-01'::DATE, '2021-02-28'::DATE)
Para um valor DATE:
year
usa apenas o ano e desconsidera todas as outras partes.month
usa o mês e o ano.day
usa a data inteira.
Para um valor TIME:
hour
usa apenas a hora e desconsidera todas as outras partes.minute
usa a hora e o minuto.second
usa a hora, minuto e segundo, mas não os segundos fracionários.millisecond
usa a hora, minuto, segundo e os três primeiros dígitos dos segundos fracionários. Os segundos fracionários não são arredondados. Por exemplo,DATEDIFF(milliseconds, '00:00:00', '00:00:01.1239')
retorna 1.123 segundos, não 1.124 segundos.microsecond
usa a hora, minuto, segundo e os primeiros seis dígitos dos segundos fracionários. Os segundos fracionários não são arredondados.nanosecond
usa a hora, minuto, segundo e todos os nove dígitos dos segundos fracionários.
Para um valor TIMESTAMP:
As regras correspondem às regras para tipo de dados DATE e TIME acima. Somente a unidade especificada e unidades maiores são utilizadas.
Para sinal de menos:
date_expr1
edate_expr2
devem ser ambos datas. Não são permitidos carimbos de data/hora e horas.
Exemplos¶
Calcular a diferença em anos entre dois carimbos de data/hora:
SELECT DATEDIFF(year, '2010-04-09 14:39:20'::TIMESTAMP, '2013-05-08 23:39:20'::TIMESTAMP) AS diff_years; +------------+ | DIFF_YEARS | |------------| | 3 | +------------+
Calcular a diferença em horas entre dois carimbos de data/hora:
SELECT DATEDIFF(hour, '2013-05-08T23:39:20.123-07:00'::TIMESTAMP, DATEADD(year, 2, ('2013-05-08T23:39:20.123-07:00')::TIMESTAMP)) AS diff_hours; +------------+ | DIFF_HOURS | |------------| | 17520 | +------------+
Demonstrar como as partes da data afetam os cálculos de DATEDIFF; também, demonstrar o uso do sinal de menos para subtração de data:
SELECT column1 date_1, column2 date_2, DATEDIFF(year, column1, column2) diff_years, DATEDIFF(month, column1, column2) diff_months, DATEDIFF(day, column1, column2) diff_days, column2::DATE - column1::DATE AS diff_days_via_minus FROM VALUES ('2015-12-30', '2015-12-31'), ('2015-12-31', '2016-01-01'), ('2016-01-01', '2017-12-31'), ('2016-08-23', '2016-09-07'); +------------+------------+------------+-------------+-----------+---------------------+ | DATE_1 | DATE_2 | DIFF_YEARS | DIFF_MONTHS | DIFF_DAYS | DIFF_DAYS_VIA_MINUS | |------------+------------+------------+-------------+-----------+---------------------| | 2015-12-30 | 2015-12-31 | 0 | 0 | 1 | 1 | | 2015-12-31 | 2016-01-01 | 1 | 1 | 1 | 1 | | 2016-01-01 | 2017-12-31 | 1 | 23 | 730 | 730 | | 2016-08-23 | 2016-09-07 | 0 | 1 | 15 | 15 | +------------+------------+------------+-------------+-----------+---------------------+
Demonstrar como as partes de tempo afetam os cálculos de DATEDIFF:
ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = 'DY, DD MON YYYY HH24:MI:SS';SELECT column1 timestamp_1, column2 timestamp_2, DATEDIFF(hour, column1, column2) diff_hours, DATEDIFF(minute, column1, column2) diff_minutes, DATEDIFF(second, column1, column2) diff_seconds FROM VALUES ('2016-01-01 01:59:59'::TIMESTAMP, '2016-01-01 02:00:00'::TIMESTAMP), ('2016-01-01 01:00:00'::TIMESTAMP, '2016-01-01 01:59:00'::TIMESTAMP), ('2016-01-01 01:00:59'::TIMESTAMP, '2016-01-01 02:00:00'::TIMESTAMP); +---------------------------+---------------------------+------------+--------------+--------------+ | TIMESTAMP_1 | TIMESTAMP_2 | DIFF_HOURS | DIFF_MINUTES | DIFF_SECONDS | |---------------------------+---------------------------+------------+--------------+--------------| | Fri, 01 Jan 2016 01:59:59 | Fri, 01 Jan 2016 02:00:00 | 1 | 1 | 1 | | Fri, 01 Jan 2016 01:00:00 | Fri, 01 Jan 2016 01:59:00 | 0 | 59 | 3540 | | Fri, 01 Jan 2016 01:00:59 | Fri, 01 Jan 2016 02:00:00 | 1 | 60 | 3541 | +---------------------------+---------------------------+------------+--------------+--------------+