DATEDIFF_BIG (Transact-SQL)
Si applica a: SQL Server 2016 (13.x) e versioni successive Database SQL di Azure Istanza gestita di SQL di Azure
Questa funzione restituisce il numero (sotto forma di valore big integer con segno) di limiti di datepart specificati sovrapposti tra gli elementi startdate ed enddate indicati.
Per una panoramica di tutti i tipi di dati e funzioni di data e ora Transact-SQL, vedere Funzioni e tipi di dati di data e ora (Transact-SQL).
Convenzioni relative alla sintassi Transact-SQL
Sintassi
DATEDIFF_BIG ( datepart , startdate , enddate )
Argomenti
datepart
Parte di startdate ed enddate che specifica il tipo di limite superato.
Nota
DATEDIFF_BIG
non accetta valori datepart da variabili definite dall'utente o come stringhe tra virgolette.
Questa tabella elenca i nomi e le abbreviazioni di tutti gli argomenti datepart validi.
Nome datepart | Abbreviazione datepart |
---|---|
year | yy, yyyy |
quarter | qq, q |
month | mm, m |
dayofyear | dy, y |
day | dd, d |
week | wk, ww |
hour | hh |
minute | mi, n |
second | ss, s |
millisecond | ms |
microsecond | mcs |
nanosecond | ns |
Nota
Ogni nome datepart specifico e le abbreviazioni datepart corrispondenti restituiscono lo stesso valore.
startdate
Espressione che può risolversi in uno dei valori seguenti:
- date
- datetime
- datetimeoffset
- datetime2
- smalldatetime
- time
Per date, DATEDIFF_BIG
accetta un'espressione di colonna, un'espressione, un valore letterale stringa o una variabile definita dall'utente. Un valore stringa deve risolversi in un elemento datetime. Per evitare problemi di ambiguità, esprimere gli anni nel formato a quattro cifre. DATEDIFF_BIG
sottrae startdate da enddate. Per evitare ambiguità, esprimere gli anni nel formato a quattro cifre. Per informazioni sugli anni a due cifre, vedere Configurare l'opzione di configurazione del server Cambio data per anno a due cifre.
enddate
Vedere startdate.
Tipo restituito
bigint con segno
Valore restituito
Restituisce la differenza bigint tra startdate ed enddate, espressa nel limite impostato da datepart.
Per un valore restituito esterno all'intervallo per bigint (da -9.223.372.036.854.775.808 a +9.223.372.036.854.775.807), DATEDIFF_BIG
restituisce un errore. DATEDIFF_BIG
non restituisce un int, in modo da poter determinare un overflow con una precisione di minute o superiore, ma può determinare un overflow solo se si usa la precisione nanosecond dove la differenza tra enddate e startdate è superiore a 292 anni, 3 mesi, 10 giorni, 23 ore, 47 minuti e 16.8547758 secondi.
Se sia a startdate che a enddate è stato assegnato solo un valore orario e datepart non è un datepart orario, DATEDIFF_BIG
restituisce 0.
Per calcolare il valore restituito, DATEDIFF_BIG
usa un componente differenza di fuso orario startdate o enddate.
Per un valore smalldatetime usato per startdate o enddate, nel valore restituito DATEDIFF_BIG
imposta sempre i secondi e i millisecondi su 0, perché smalldatetime garantisce la precisione solo a livello di minuti.
Se a una variabile di tipo data viene assegnato solo il valore dell'ora, DATEDIFF_BIG
imposta il valore della parte mancante della data sul valore predefinito: 1900-01-01
. Se a una variabile di tipo ora o data viene assegnato solo il valore della data, DATEDIFF_BIG
imposta il valore della parte mancante dell'ora sul valore predefinito: 00:00:00
. Se startdate ed enddate hanno rispettivamente solo la parte relativa all'ora o solo la parte relativa alla data, DATEDIFF_BIG
imposta le parti mancanti sui rispettivi valori predefiniti.
Se i valori startdate ed enddate sono di tipi data diversi e uno di questi comprende un numero maggiore di parti di ora o offre una precisione in secondi frazionari maggiore, DATEDIFF_BIG
imposta le parti mancanti dell'altro valore su 0.
Limiti di datepart
Le istruzioni seguenti hanno gli stessi valori startdate ed enddate. Queste date sono adiacenti e differiscono di cento nanosecondi (0,0000001 secondi). La differenza tra startdate e enddate in ogni istruzione oltrepassa un limite di calendario o di ora del rispettivo valore datepart. Ciascuna istruzione restituisce 1. Se startdate ed enddate hanno valori di anno diversi, ma gli stessi valori di settimana di calendario, DATEDIFF_BIG
restituirà 0 per datepart week.
SELECT DATEDIFF_BIG(year, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(quarter, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(month, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(dayofyear, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(day, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(week, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(hour, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(minute, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(second, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
Osservazioni:
Usare DATEDIFF_BIG
nelle clausole SELECT <list>
, WHERE
, HAVING
, GROUP BY
e ORDER BY
.
DATEDIFF_BIG
consente di eseguire in modo implicito il cast di valori letterali stringa come tipo di dati datetime2. DATEDIFF_BIG
, pertanto, non supporta il formato AGM se la data viene passata come stringa. Per usare il formato AGM è necessario eseguire il cast della stringa in modo esplicito in un tipo datetime o smalldatetime.
La specifica di SET DATEFIRST
non ha alcun effetto su DATEDIFF_BIG
. DATEDIFF_BIG
usa sempre la domenica come primo giorno della settimana, per garantire che la funzione operi in modo deterministico.
DATEDIFF_BIG
può determinare un overflow con nanosecond se la differenza tra enddate e startdate restituisce un valore non compreso nell'intervallo per bigint.
Esempi
Specifica di colonne per startdate ed enddate
Questo esempio, che usa tipi diversi di espressioni come argomenti per i parametri startdate ed enddate, calcola il numero di limiti di giorno sovrapposti tra le date di due colonne di una tabella.
CREATE TABLE dbo.Duration
(startDate datetime2, endDate datetime2);
INSERT INTO dbo.Duration(startDate,endDate)
VALUES('2007-05-06 12:10:09', '2007-05-07 12:10:09');
SELECT DATEDIFF_BIG(day, startDate, endDate) AS 'Duration'
FROM dbo.Duration;
-- Returns: 1
Ricerca della differenza tra startdate e enddate come stringhe di parti di data
DECLARE @date1 DATETIME2, @date2 DATETIME2, @result VARCHAR(100)
DECLARE @years BIGINT, @months BIGINT, @days BIGINT, @hours BIGINT, @minutes BIGINT, @seconds BIGINT, @milliseconds BIGINT
SET @date1 = '0001-01-01 00:00:00.00000000'
SET @date2 = '2018-12-12 07:08:01.12345678'
SELECT @years = DATEDIFF(yy, @date1, @date2)
IF DATEADD(yy, -@years, @date2) < @date1
SELECT @years = @years-1
SET @date2 = DATEADD(yy, -@years, @date2)
SELECT @months = DATEDIFF(mm, @date1, @date2)
IF DATEADD(mm, -@months, @date2) < @date1
SELECT @months=@months-1
SET @date2= DATEADD(mm, -@months, @date2)
SELECT @days=DATEDIFF(dd, @date1, @date2)
IF DATEADD(dd, -@days, @date2) < @date1
SELECT @days=@days-1
SET @date2= DATEADD(dd, -@days, @date2)
SELECT @hours=DATEDIFF(hh, @date1, @date2)
IF DATEADD(hh, -@hours, @date2) < @date1
SELECT @hours=@hours-1
SET @date2= DATEADD(hh, -@hours, @date2)
SELECT @minutes=DATEDIFF(mi, @date1, @date2)
IF DATEADD(mi, -@minutes, @date2) < @date1
SELECT @minutes=@minutes-1
SET @date2= DATEADD(mi, -@minutes, @date2)
SELECT @seconds=DATEDIFF(s, @date1, @date2)
IF DATEADD(s, -@seconds, @date2) < @date1
SELECT @seconds=@seconds-1
SET @date2= DATEADD(s, -@seconds, @date2)
SELECT @milliseconds=DATEDIFF(ms, @date1, @date2)
SELECT @result= ISNULL(CAST(NULLIF(@years,0) AS VARCHAR(10)) + ' years,','')
+ ISNULL(' ' + CAST(NULLIF(@months,0) AS VARCHAR(10)) + ' months,','')
+ ISNULL(' ' + CAST(NULLIF(@days,0) AS VARCHAR(10)) + ' days,','')
+ ISNULL(' ' + CAST(NULLIF(@hours,0) AS VARCHAR(10)) + ' hours,','')
+ ISNULL(' ' + CAST(@minutes AS VARCHAR(10)) + ' minutes and','')
+ ISNULL(' ' + CAST(@seconds AS VARCHAR(10))
+ CASE WHEN @milliseconds > 0 THEN '.' + CAST(@milliseconds AS VARCHAR(10))
ELSE '' END
+ ' seconds','')
SELECT @result
Il set di risultati è il seguente.
2017 years, 11 months, 11 days, 7 hours, 8 minutes and 1.123 seconds
Per esempi più strettamente correlati, vedere DATEDIFF (Transact-SQL).