DATETRUNC (Transact-SQL)
Si applica a: endpoint di analisi SQL Server 2022 (16.x) database SQL di Azure Istanza gestita di SQL di Azure SQL in Microsoft FabricWarehouse in Microsoft Fabric
La DATETRUNC
funzione restituisce una data di input troncata a una datepart specificata.
Sintassi
DATETRUNC ( datepart, date )
Argomenti
datepart
Specifica la precisione per il troncamento. Questa tabella elenca tutti i valori datepart validi per DATETRUNC
, dato che è anche una parte valida del tipo di data di input.
datepart | Abbreviations | Note sul troncamento |
---|---|---|
year | yy, yyyy | |
quarter | qq, q | |
month | mm, m | |
dayofyear | dy, y | dayofyear viene troncato nello stesso modo di day |
day | dd, d | day viene troncato nello stesso modo di dayofyear |
week | wk, ww | La data viene troncata in base al primo giorno della settimana. In T-SQL il primo giorno della settimana viene definito dall'impostazione T-SQL @@DATEFIRST . Per un ambiente in inglese Stati Uniti, il valore predefinito di @@DATEFIRST è 7 (domenica). |
iso_week | isowk, isoww | La data viene troncata in base al primo giorno di una settimana ISO. Nel sistema di calendario ISO8601, il primo giorno della settimana è lunedì. |
hour | hh | |
minute | mi, n | |
second | ss, s | |
millisecond | ms | |
microsecond | mcs |
Nota
Le datepart T-SQL del giorno della settimana, del fuso orario e del nanosecondo non sono supportate per DATETRUNC
.
date
Accetta qualsiasi espressione, colonna o variabile definita dall'utente che può essere risolta in qualsiasi tipo di data o ora T-SQL valido. I tipi validi sono:
- smalldatetime
- datetime
- date
- time
- datetime2
- datetimeoffset
Non confondere il parametro date con il tipo di dati date .
DATETRUNC
accetterà anche un valore letterale stringa (di qualsiasi tipo stringa) che può essere risolto in un valore datetime2(7).
Tipo restituito
Il tipo di dati restituito per DATETRUNC
è dinamico. DATETRUNC
restituisce una data troncata dello stesso tipo di dati (e, se applicabile, la stessa scala temporale frazionaria) della data di input. Ad esempio, se DATETRUNC
è stata assegnata una data di input datetimeoffset(3), restituisce un datetimeoffset(3). Se è stato assegnato un valore letterale stringa che potrebbe risolversi in un valore datetime2(7),restituirebbe DATETRUNC
un valore datetime2(7).
Precisione della scala temporale frazionaria
La scala temporale frazionaria dei millisecondi è in base 3 (), mentre quella dei microsecondi è in base 6 (.123
) e quella dei nanosecondi è in base 9 (.123456
.123456789
). La scala temporale frazionaria massima dei tipi di dati time, datetime2 e datetimeoffset è in base 7 (.1234567
). Pertanto, per troncare alla millisecond
datepart, la scala temporale frazionaria deve essere almeno 3. Analogamente, per troncare alla microsecond
datepart, la scala temporale frazionaria deve essere almeno 6. DATETRUNC
non supporta datepart nanosecond
perché nessun tipo di data T-SQL supporta una scala temporale frazionaria pari a 9.
Esempi
R. Usare opzioni datepart diverse
Gli esempi seguenti illustrano l'uso di varie opzioni datepart :
DECLARE @d datetime2 = '2021-12-08 11:30:15.1234567';
SELECT 'Year', DATETRUNC(year, @d);
SELECT 'Quarter', DATETRUNC(quarter, @d);
SELECT 'Month', DATETRUNC(month, @d);
SELECT 'Week', DATETRUNC(week, @d); -- Using the default DATEFIRST setting value of 7 (U.S. English)
SELECT 'Iso_week', DATETRUNC(iso_week, @d);
SELECT 'DayOfYear', DATETRUNC(dayofyear, @d);
SELECT 'Day', DATETRUNC(day, @d);
SELECT 'Hour', DATETRUNC(hour, @d);
SELECT 'Minute', DATETRUNC(minute, @d);
SELECT 'Second', DATETRUNC(second, @d);
SELECT 'Millisecond', DATETRUNC(millisecond, @d);
SELECT 'Microsecond', DATETRUNC(microsecond, @d);
Il set di risultati è il seguente:
Year 2021-01-01 00:00:00.0000000
Quarter 2021-10-01 00:00:00.0000000
Month 2021-12-01 00:00:00.0000000
Week 2021-12-05 00:00:00.0000000
Iso_week 2021-12-06 00:00:00.0000000
DayOfYear 2021-12-08 00:00:00.0000000
Day 2021-12-08 00:00:00.0000000
Hour 2021-12-08 11:00:00.0000000
Minute 2021-12-08 11:30:00.0000000
Second 2021-12-08 11:30:15.0000000
Millisecond 2021-12-08 11:30:15.1230000
Microsecond 2021-12-08 11:30:15.1234560
B. Impostazione @@DATEFIRST
Gli esempi seguenti illustrano l'uso dell'impostazione @@DATEFIRST
con datepartweek
:
DECLARE @d datetime2 = '2021-11-11 11:11:11.1234567';
SELECT 'Week-7', DATETRUNC(week, @d); -- Uses the default DATEFIRST setting value of 7 (U.S. English)
SET DATEFIRST 6;
SELECT 'Week-6', DATETRUNC(week, @d);
SET DATEFIRST 3;
SELECT 'Week-3', DATETRUNC(week, @d);
Il set di risultati è il seguente:
Week-7 2021-11-07 00:00:00.0000000
Week-6 2021-11-06 00:00:00.0000000
Week-3 2021-11-10 00:00:00.0000000
C. Valori letterali data
Gli esempi seguenti illustrano l'uso dei valori letterali dei parametri di data :
SELECT DATETRUNC(month, '1998-03-04');
SELECT DATETRUNC(millisecond, '1998-03-04 10:10:05.1234567');
DECLARE @d1 char(200) = '1998-03-04';
SELECT DATETRUNC(millisecond, @d1);
DECLARE @d2 nvarchar(max) = '1998-03-04 10:10:05';
SELECT DATETRUNC(minute, @d2);
Di seguito viene riportato il set di risultati (tutti i risultati sono di tipo datetime2(7)):
1998-03-01 00:00:00.0000000
1998-03-04 10:10:05.1230000
1998-03-04 00:00:00.0000000
1998-03-04 10:10:00.0000000
D. Variabili e il parametro date
Nell'esempio seguente viene illustrato l'uso del parametro date :
DECLARE @d datetime2 = '1998-12-11 02:03:04.1234567';
SELECT DATETRUNC(day, @d);
Il risultato è il seguente:
1998-12-11 00:00:00.0000000
E. Colonne e il parametro date
La TransactionDate
colonna della Sales.CustomerTransactions
tabella funge da argomento di colonna di esempio per il parametro date:
USE WideWorldImporters;
SELECT CustomerTransactionID,
DATETRUNC(month, TransactionDate) AS MonthTransactionOccurred,
InvoiceID,
CustomerID,
TransactionAmount,
SUM(TransactionAmount) OVER (
PARTITION BY CustomerID ORDER BY TransactionDate,
CustomerTransactionID ROWS UNBOUNDED PRECEDING
) AS RunningTotal,
TransactionDate AS ActualTransactionDate
FROM [WideWorldImporters].[Sales].[CustomerTransactions]
WHERE InvoiceID IS NOT NULL
AND DATETRUNC(month, TransactionDate) >= '2015-12-01';
F. Espressioni e il parametro date
Il parametro date accetta qualsiasi espressione in grado di risolvere in un tipo di data T-SQL o in qualsiasi valore letterale stringa che può essere risolto in un valore datetime2(7). La TransactionDate
colonna della Sales.CustomerTransactions
tabella funge da argomento artificiale per esemplificare l'uso di un'espressione per il parametro date:
SELECT DATETRUNC(m, SYSDATETIME());
SELECT DATETRUNC(yyyy, CONVERT(date, '2021-12-1'));
USE WideWorldImporters;
GO
SELECT DATETRUNC(month, DATEADD(month, 4, TransactionDate))
FROM Sales.CustomerTransactions;
GO
G. Tronca una data a un datepart che rappresenta la precisione massima
Se datepart ha la stessa precisione massima dell'unità del tipo di data di input, il troncamento della data di input a questo datepart non avrà alcun effetto.
Esempio 1
DECLARE @d datetime = '2015-04-29 05:06:07.123';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(millisecond, @d);
Ecco il set di risultati, che illustra che il valore datetime di input e il parametro date troncato sono gli stessi:
Input 2015-04-29 05:06:07.123
Truncated 2015-04-29 05:06:07.123
Esempio 2
DECLARE @d date = '2050-04-04';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(day, @d);
Ecco il set di risultati, che illustra che il valore datetime di input e il parametro date troncato sono gli stessi:
Input 2050-04-04
Truncated 2050-04-04
Esempio 3: precisione smalldatetime
smalldatetime è preciso solo fino al minuto più vicino, anche se include un campo per i secondi. Troncare la data al minuto o al secondo più vicino non avrebbe quindi alcun effetto.
DECLARE @d smalldatetime = '2009-09-11 12:42:12'
SELECT 'Input', @d;
SELECT 'Truncated to minute', DATETRUNC(minute, @d)
SELECT 'Truncated to second', DATETRUNC(second, @d);
Il set di risultati illustra che il valore smalldatetime di input corrisponde a entrambi i valori troncati:
Input 2009-09-11 12:42:00
Truncated to minute 2009-09-11 12:42:00
Truncated to second 2009-09-11 12:42:00
Esempio 4: precisione datetime
datetime è preciso solo fino a 3,33 millisecondi. Troncare un valore datetime a un millisecondo può quindi restituire risultati diversi da quelli previsti dall'utente. Questo valore troncato corrisponde tuttavia al valore datetime archiviato internamente.
DECLARE @d datetime = '2020-02-02 02:02:02.002';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(millisecond, @d);
Ecco il set di risultati, che illustra che la data troncata corrisponde alla data archiviata. Questo può essere diverso da quello previsto in base all'istruzione DECLARE
.
Input 2020-02-02 02:02:02.003
Truncated 2020-02-02 02:02:02.003
Osservazioni:
Viene generato un DATE TOO SMALL
errore se il troncamento della data tenta di eseguire il backtracking di una data prima della data minima supportata da tale tipo di dati. Ciò si verifica solo quando si usa datepartweek
. Non può verificarsi quando si usa datepartiso_week
, poiché tutti i tipi di data T-SQL usano in modo casuale un lunedì per le date minime. Di seguito è riportato un esempio con il messaggio di errore corrispondente:
DECLARE @d date= '0001-01-01 00:00:00';
SELECT DATETRUNC(week, @d);
Msg 9837, Level 16, State 3, Line 84
An invalid date value was encountered: The date value is less than the minimum date value allowed for the data type.
Viene generato un DATEPART
errore se datepart usato non è supportato dalla DATETRUNC
funzione o dal tipo di dati data di input. Questo può verificarsi nei casi seguenti:
Viene usato un elemento datepart non supportato da
DATETRUNC
(vale a essere,weekday
,tzoffset
onanosecond
)Un datepart correlato all'ora viene utilizzato con il tipo di dati date o un datepart correlato alla data viene utilizzato con il tipo di dati time. Di seguito è riportato un esempio con il messaggio di errore corrispondente:
DECLARE @d time = '12:12:12.1234567'; SELECT DATETRUNC(year, @d);
Msg 9810, Level 16, State 10, Line 78 The datepart year is not supported by date function datetrunc for data type time.
Il valore datepart richiede una precisione della scala temporale frazionaria superiore a quella supportata dal tipo di dati (vedere Precisione della scala temporale frazionaria). Di seguito è riportato un esempio con il messaggio di errore corrispondente:
DECLARE @d datetime2(3) = '2021-12-12 12:12:12.12345'; SELECT DATETRUNC(microsecond, @d);
Msg 9810, Level 16, State 11, Line 81 The datepart microsecond is not supported by date function datetrunc for data type datetime2.
Vedi anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per