Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op: SQL Server 2022 (16.x)
Azure SQL Database
Azure SQL Managed Instance
SQL analytics endpoint in Microsoft Fabric
Warehouse in Microsoft Fabric SQL
database in Microsoft Fabric
De DATETRUNC functie geeft een invoerdatum terug die is afgekapt tot een gespecificeerd datepart.
Opmerking
DATETRUNC werd geïntroduceerd in SQL Server 2022 (16.x).
Syntaxis
DATETRUNC ( datepart , date )
Arguments
datepart
Specificeert de precisie voor afkapping. Deze tabel geeft alle geldige datepart-waarden voor DATETRUNCweer, aangezien het ook een geldig deel is van het invoerdatumtype.
| datepart | Abbreviations | Afkapnotities |
|---|---|---|
year |
yy, yyyy |
|
quarter |
qq, q |
|
month |
mm, m |
|
dayofyear |
dy, y |
dayofyear wordt op dezelfde manier afgeknott als day |
day |
dd, d |
day wordt op dezelfde manier afgeknott als dayofyear |
week |
wk, ww |
Kort af tot de eerste dag van de week. In T-SQL wordt de eerste dag van de week gedefinieerd door de @@DATEFIRST T-SQL-instelling. Voor een Amerikaans-Engelse omgeving is @@DATEFIRST7 het standaard (zondag). |
iso_week |
isowk, isoww |
Kort af tot de eerste dag van een ISO-week. De eerste dag van de week in het ISO8601 kalendersysteem is maandag. |
hour |
hh |
|
minute |
mi, n |
|
second |
ss, s |
|
millisecond |
ms |
|
microsecond |
mcs |
Opmerking
De weekday, timezoneoffset en nanoseconde T-SQL dateparts worden niet ondersteund voor DATETRUNC.
date
Accepteert elke expressie, kolom of door de gebruiker gedefinieerde variabele die kan worden opgelost naar elk geldig T-SQL datum- of tijdtype. Geldige types zijn:
- smalldatetime
- datetime
- date
- time
- datetime2
- datetimeoffset
Verwar de datumparameter niet met het datatype .
DATETRUNCaccepteert ook een stringliteral (van elk stringtype) die kan worden opgelost tot een datetime2(7).
Retourtypen
Het geretourneerde datatype voor DATETRUNC is dynamisch.
DATETRUNC geeft een afgeknotte datum van hetzelfde datatype (en, indien van toepassing, dezelfde fractionele tijdschaal) terug als de invoerdatum. Als DATETRUNC bijvoorbeeld een datetimeoffset(3) invoerdatum is gegeven, zou het een datetimeoffset(3) teruggeven. Als het een stringliteraal kreeg die kon worden opgelost tot een datetime2(7),DATETRUNC zou een datetime2(7) teruggeven.
Fractionele tijdschaalprecisie
Milliseconden hebben een fractionele tijdschaal van 3 (.123), microseconden een fractionele tijdschaal van 6 (.123456), en nanoseconden een fractionele tijdschaal van 9 (.123456789). De datatypes tijd, datetime2 en datetimeoffset maken een maximale fractionele tijdschaal van 7 (.1234567). Daarom moet de fractionele tijdschaal minstens 3 zijn om tot het milliseconddatumdeel af te kappen. Evenzo moet de fractionele tijdschaal minimaal 6 zijn om af te korten tot het microseconddatumdeel.
DATETRUNC ondersteunt de nanoseconddatepart niet, omdat geen enkel T-SQL-datumtype een fractionele tijdschaal van 9 ondersteunt.
Voorbeelden
Eén. Gebruik verschillende datumdeelopties
De volgende voorbeelden illustreren het gebruik van verschillende datepart-opties :
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);
Hier is het resultatenoverzicht.
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. @@DATEFIRST setting
De volgende voorbeelden illustreren het gebruik van de @@DATEFIRST setting met het weekdatumgedeelte:
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);
Hier is het resultatenoverzicht.
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. Datumletterlijke
De volgende voorbeelden illustreren het gebruik van datumparameterliterals :
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);
Hier is het resultatenoverzicht. Alle resultaten zijn van type 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. Variabelen en de datumparameter
Het volgende voorbeeld illustreert het gebruik van de datumparameter :
DECLARE @d datetime2 = '1998-12-11 02:03:04.1234567';
SELECT DATETRUNC(day, @d);
Hier is het resultatenoverzicht.
1998-12-11 00:00:00.0000000
E. Kolommen en de datumparameter
De TransactionDate kolom uit de Sales.CustomerTransactions tabel dient als voorbeeldkolomargument voor de datumparameter :
USE WideWorldImporters;
GO
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. Uitdrukkingen en de datumparameter
De datumparameter accepteert elke expressie die kan worden opgelost naar een T-SQL date-type of elk string-literaal dat kan worden opgelost tot een datetime2(7). De TransactionDate kolom uit de Sales.CustomerTransactions tabel dient als een kunstmatig argument om het gebruik van een uitdrukking voor de datumparameter te illustreren:
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. Kort een datum af tot een datepart die de maximale precisie aangeeft
Als het datepart dezelfde maximale eenheidsprecisie heeft als het invoerdatumtype, zou het afkappen van de inputdatum naar deze datepart geen effect hebben.
Voorbeeld 1
DECLARE @d datetime = '2015-04-29 05:06:07.123';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(millisecond, @d);
Hier is het resultatenoverzicht. De invoerdatum-tijd en de afgeknotte datumparameter zijn hetzelfde.
Input 2015-04-29 05:06:07.123
Truncated 2015-04-29 05:06:07.123
Voorbeeld 2
DECLARE @d date = '2050-04-04';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(day, @d);
Hier is het resultatenoverzicht. De invoerdatum-tijd en de afgeknotte datumparameter zijn hetzelfde.
Input 2050-04-04
Truncated 2050-04-04
Voorbeeld 3: precisie met kleine datumtijd
smalldatetime is alleen precies tot de dichtstbijzijnde minuut, ook al heeft het een veld voor seconden. Daarom zou het afkappen tot de dichtstbijzijnde minuut of de dichtstbijzijnde seconde geen effect hebben.
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);
Hier is het resultatenoverzicht. De invoer smalldatetime-waarde is hetzelfde als beide afgeknotte waarden:
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
Voorbeeld 4: datum-tijdprecisie
Datetime is slechts tot 3,33 milliseconden nauwkeurig. Daarom kan het afkorten van een datetime tot een milliseconde resultaten opleveren die anders zijn dan wat de gebruiker verwacht. Deze afgeknotte waarde is echter hetzelfde als de intern opgeslagen datetime-waarde .
DECLARE @d datetime = '2020-02-02 02:02:02.002';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(millisecond, @d);
Hier is het resultatenoverzicht. De afgeknotte datum is hetzelfde als de opgeslagen datum. Dit kan anders zijn dan wat je verwacht op basis van de DECLARE verklaring.
Input 2020-02-02 02:02:02.003
Truncated 2020-02-02 02:02:02.003
Opmerkingen
Er wordt een foutmelding gegeven als de datumafkorting probeert terug te gaan naar een datum vóór de minimale datum die door dat datatype wordt ondersteund. Deze fout doet zich alleen voor bij gebruik van de weekdatepart. Het kan niet gebeuren bij gebruik van de iso_weekdatumdeel, omdat alle T-SQL-datumtypes toevallig een maandag gebruiken als minimumdata. Hier is een voorbeeld met de bijbehorende foutmelding:
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.
Er wordt een DATEPART foutmelding gegeven als de DATETRUNC functie, of het invoerdatumdatatype, het gebruikte datepart niet ondersteunt. Deze fout kan optreden wanneer:
Een datepart die niet wordt ondersteund door
DATETRUNCwordt gebruikt (namelijk,weekday,tzoffset, ofnanosecond)Een tijd-gerelateerdedatumdeel wordt gebruikt met het datumdatatype, of een datumgerelateerd datumdeel wordt gebruikt met het tijdsdatatype. Hier is een voorbeeld met de bijbehorende foutmelding:
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.Het date-deel vereist een hogere fractionele tijdschaalprecisie dan het datatype ondersteunt. Voor meer informatie, zie Fractionele tijdschaalprecisie. Hier is een voorbeeld met de bijbehorende foutmelding:
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.