Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Exemplos de DATEDIFF() no SQL Server


No SQL Server, você pode usar o T-SQL DATEDIFF() função para retornar a diferença entre duas datas/horas. Funciona em qualquer expressão que possa ser resolvida em um tempodatapequena data e horadatahoradatahora2 , ou deslocamento de data e hora valor.

Este artigo fornece exemplos do DATEDIFF() função no SQL Server.


Sintaxe


Primeiro, aqui está a sintaxe:
DATEDIFF ( datepart , startdate , enddate )

Onde datepart é a parte da data que você deseja comparar. data de início é a primeira data e data final é a data final.

A maneira como funciona é que ele retorna a contagem (como um valor inteiro assinado) do datepart especificado limites cruzados entre a data de início especificada e data de término .

Exemplo 1


Aqui está um exemplo básico onde descobrimos o número de dias entre duas datas:
SELECT DATEDIFF(day, '2001-01-01', '2002-01-01') AS Result;

Resultado:
+----------+
| Result   |
|----------|
| 365      |
+----------+

Exemplo 2


Aqui está outro exemplo onde eu declaro duas variáveis ​​e atribuo duas datas diferentes a elas (eu uso DATEADD() para adicionar 1 ano à primeira data). Eu então uso DATEDIFF() para retornar várias partes de data para essa data:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(year, 1, @date1);
SELECT 
    DATEDIFF( year, @date1, @date2 ) AS Years,
    DATEDIFF( quarter, @date1, @date2 ) AS Quarters,
    DATEDIFF( month, @date1, @date2 ) AS Months,
    DATEDIFF( week, @date1, @date2 ) AS Weeks,
    DATEDIFF( dayofyear, @date1, @date2 ) AS DayOfYear,
    DATEDIFF( day, @date1, @date2 ) AS Days;

Resultado:
+---------+------------+----------+---------+-------------+--------+
| Years   | Quarters   | Months   | Weeks   | DayOfYear   | Days   |
|---------+------------+----------+---------+-------------+--------|
| 1       | 4          | 12       | 53      | 366         | 366    |
+---------+------------+----------+---------+-------------+--------+

Exemplo 3


Como mencionado, você também pode retornar as partes de tempo entre as datas. Aqui está um exemplo de como retornar o número de horas, minutos e segundos entre os valores de data/hora:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(hour, 1, @date1);
SELECT 
    DATEDIFF( hour, @date1, @date2 ) AS Hours,
    DATEDIFF( minute, @date1, @date2 ) AS Minutes,
    DATEDIFF( second, @date1, @date2 ) AS Seconds;

Resultado:
+---------+-----------+-----------+
| Hours   | Minutes   | Seconds   |
|---------+-----------+-----------|
| 1       | 60        | 3600      |
+---------+-----------+-----------+

Exemplo 4


E aqui está um exemplo de como obter o número de milissegundos, microssegundos e nanossegundos entre dois valores de data/hora:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(millisecond, 1, @date1);
SELECT    
    DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds,
    DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds,
    DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;

Resultado:
+----------------+----------------+---------------+
| Milliseconds   | Microseconds   | Nanoseconds   |
|----------------+----------------+---------------|
| 1              | 1000           | 1000000       |
+----------------+----------------+---------------+

Exemplo 5 – Erro!


Se você tentar fazer algo extremo, como retornar o número de nanossegundos em 100 anos, receberá um erro. Isso ocorre porque DATEDIFF() retorna um int valor, e há mais nanossegundos em 100 anos do que o int tipo de dados pode manipular.

Então aqui está o que acontece se você tentar fazer isso:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(year, 100, @date1);
SELECT    
    DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds,
    DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds,
    DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;

Resultado:
The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart. 

Felizmente, se você realmente precisa descobrir quantos nanossegundos existem em 100 anos, você pode usar o DATEDIFF_BIG() função em vez disso. Esta função retorna um bigint assinado tipo de dados, que permite retornar valores muito maiores que DATEDIFF() posso.

Exemplo 6 – Obtendo resultados estranhos?


Os resultados que você obtém de DATEDIFF() às vezes pode parecer completamente errado se você não souber como a função realmente funciona.

Por exemplo:
DECLARE 
  @startdate datetime2 = '2016-01-01  00:00:00.0000000', 
  @enddate datetime2 = '2016-12-31 23:59:59.9999999';
SELECT 
  DATEDIFF(day, @startdate, @enddate) Days,
  DATEDIFF(year, @startdate, @enddate) Years;

Resultado:
+--------+---------+
| Days   | Years   |
|--------+---------|
| 365    | 0       |
+--------+---------+

Se você não sabe como DATEDIFF() realmente funciona, esse resultado pode parecer tão errado, que você seria perdoado por assumir que é um bug. Mas não é um bug.

Confira DATEDIFF() retorna resultados errados no SQL Server? Leia isso. para ver este exemplo e outros casos em que os resultados podem parecer completamente errados, mas estar perfeitamente corretos (e para uma explicação sobre por que eles têm essa aparência).

Um dos exemplos nessa página provavelmente vale a pena mencionar novamente aqui. DATEDIFF() realmente ignora seu SET DATEFIRST valor. Isso pode resultar em resultados inesperados, especialmente se você estiver em uma cultura que não usa o domingo como o primeiro dia da semana. Confira esta solução alternativa para DATEDIFF() Ignorando SET DATEFIRST no SQL Server se achar que isso pode afetá-lo.