Delen via


DATETRUNC (Transact-SQL)

Van toepassing op: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL analytics endpoint in Microsoft FabricWarehouse in Microsoft Fabric SQLdatabase 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:

  1. Een datepart die niet wordt ondersteund door DATETRUNC wordt gebruikt (namelijk, weekday, tzoffset, of nanosecond)

  2. 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.
    
  3. 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.