Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

DATEDIFF() Esempi in SQL Server

In SQL Server puoi utilizzare il DATEDIFF() di T-SQL funzione per restituire la differenza tra due date/ore. Funziona su qualsiasi espressione che può essere risolta in un tempodatasmalldatetimedata e oradataora2datetimeoffset valore.

Questo articolo fornisce esempi di DATEDIFF() funzione in SQL Server.

Sintassi

Innanzitutto, ecco la sintassi:

DATEDIFF ( datepart , startdate , enddate )

Dove datapart è la parte della data che vuoi confrontare. data di inizio è la prima data e la data finale è la data di fine.

Il modo in cui funziona è che restituisce il conteggio (come valore intero con segno) del datepart specificato limiti attraversati tra la data di inizio specificata e data di fine .

Esempio 1

Ecco un esempio di base in cui scopriamo il numero di giorni tra due date:

SELECT DATEDIFF(day, '2001-01-01', '2002-01-01') AS Result;

Risultato:

+----------+
| Result   |
|----------|
| 365      |
+----------+

Esempio 2

Ecco un altro esempio in cui dichiaro due variabili e assegno loro due date diverse (uso DATEADD() aggiungere 1 anno alla prima data). Quindi uso DATEDIFF() per restituire varie parti di date per quella 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;

Risultato:

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

Esempio 3

Come accennato, puoi anche restituire le parti temporali tra le date. Ecco un esempio di restituzione del numero di ore, minuti e secondi tra i valori di data/ora:

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;

Risultato:

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

Esempio 4

Ed ecco un esempio di come ottenere il numero di millisecondi, microsecondi e nanosecondi tra due valori di data/ora:

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;

Risultato:

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

Esempio 5 – Errore!

Se provi a fare qualcosa di estremo, come restituire il numero di nanosecondi in 100 anni, riceverai un errore. Questo perché DATEDIFF() restituisce un int valore e ci sono più nanosecondi in 100 anni rispetto a int tipo di dati può gestire.

Quindi, ecco cosa succede se provi a farlo:

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;

Risultato:

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. 

Fortunatamente, se proprio devi scoprire quanti nanosecondi sono in 100 anni, puoi usare il DATEDIFF_BIG() funzione invece. Questa funzione restituisce un bigint con segno tipo di dati, che ti consente di restituire valori molto più grandi di DATEDIFF() può.

Esempio 6:ottenere risultati strani?

I risultati che ottieni da DATEDIFF() a volte può sembrare completamente sbagliato se non sai come funziona effettivamente la funzione.

Ad esempio:

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;

Risultato:

+--------+---------+
| Days   | Years   |
|--------+---------|
| 365    | 0       |
+--------+---------+

Se non sai come DATEDIFF() funziona davvero, questo risultato potrebbe sembrare così sbagliato che saresti perdonato se supponessi che si tratta di un bug. Ma non è un bug.

Dai un'occhiata a DATEDIFF() restituisce risultati errati in SQL Server? Leggi questo. per vedere questo esempio e altri casi in cui i risultati possono sembrare completamente sbagliati, ma essere perfettamente corretti (e per una spiegazione sul perché hanno l'aspetto che hanno).

Probabilmente vale la pena menzionare ancora qui uno degli esempi in quella pagina. DATEDIFF() ignora effettivamente il tuo SET DATEFIRST valore. Ciò può portare a risultati inaspettati, soprattutto se ti trovi in ​​una cultura che non usa la domenica come primo giorno della settimana. Dai un'occhiata a questa soluzione alternativa per DATEDIFF() Ignorando SET DATEFIRST in SQL Server se ritieni che ciò possa influire su di te.