Udostępnij za pomocą


DATETRUNC (Transact-SQL)

Dotyczy do: SQL Server 2022 (16.x) Azure SQL Database AzureSQL Managed InstanceSQL Analytics endpoint in Microsoft FabricWarehouse in Microsoft FabricSQL database in Microsoft Fabric

Funkcja DATETRUNC zwraca datę wejściową obciętą do określonej części daty.

Uwaga / Notatka

DATETRUNC został wprowadzony w SQL Server 2022 (16.x).

Składnia

DATETRUNC ( datepart , date )

Arguments

datepart

Określa precyzję obcięcia. Ta tabela zawiera wszystkie poprawne wartości datepart dla DATETRUNC, pod warunkiem, że jest to również poprawna część typu daty wejściowej.

datepart Abbreviations Notatki o obcinaniu
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y dayofyear jest obcięty w ten sam sposób co day
day dd, d day jest obcięty w ten sam sposób co dayofyear
week wk, ww Skrąć do pierwszego dnia tygodnia. W T-SQL pierwszy dzień tygodnia jest definiowany przez ustawienie @@DATEFIRST T-SQL. W środowisku angielskim w USA domyślnie @@DATEFIRST ustawione jest ( 7 Sunday).
iso_week isowk, isoww Skrąć do pierwszego dnia tygodnia ISO. Pierwszy dzień tygodnia w systemie kalendarza ISO8601 to poniedziałek.
hour hh
minute mi, n
second ss, s
millisecond ms
microsecond mcs

Uwaga / Notatka

Daty datowe w dni powszednie, strefy czasowej oraz nanosekundowe części datowe T-SQL nie są obsługiwane dla DATETRUNC.

date

Akceptuje dowolne wyrażenie, kolumnę lub zmienną zdefiniowaną przez użytkownika, która może rozwiązywać dowolny ważny typ daty lub godziny T-SQL. Poprawne typy to:

  • smalldatetime
  • datetime
  • date
  • time
  • datetime2
  • datetimeoffset

Nie myl parametru daty z typem danych daty .

DATETRUNCakceptuje także literal ciągu (dowolnego typu łańcucha), który może rozwiązywać się na datetime2(7).

Typy zwracane

Zwrócony typ danych dla DATETRUNC jest dynamiczny. DATETRUNC zwraca obciętą datę tego samego typu danych (i, jeśli dotyczy, tej samej skali czasowej ułamkowej) co data wejściowa. Na przykład, jeśli DATETRUNC podano datetimeoffset(3) wejściową datę, zwraca datetimeoffset(3). Jeśli podano mu literal, który mógłby rozwiązywać się na datetime2(7), zwracałby DATETRUNCdatetime2(7).

Precyzja skali czasowej ułamkowej

Milisekundy mają skalę czasową ułamkową równą 3 (),.123 mikrosekundy mają skalę ułamkową 6 (.123456), a nanosekundy skalę ułamkową 9 (.123456789). Typy danych time, datetime2 i datetimeoffset pozwalają na maksymalną skalę ułamkową czasu wynoszącą 7 (.1234567). Dlatego, aby obciąć do części datymillisecond, skala czasowa ułamkowa musi wynosić co najmniej 3. Podobnie, aby obciąć do microsecondczęści daty, skala czasowa ułamkowa musi wynosić co najmniej 6. DATETRUNCnie obsługuje datepart, nanosecond ponieważ żaden typ daty T-SQL nie obsługuje ułamkowej skali czasu 9.

Przykłady

A. Używaj różnych opcji datepart

Poniższe przykłady ilustrują zastosowanie różnych opcji 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);

Oto zestaw wyników.

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 świat

Poniższe przykłady ilustrują użycie @@DATEFIRST ustawienia z częścią datyweek:

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);

Oto zestaw wyników.

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. Literale datowe

Poniższe przykłady ilustrują użycie literałów parametrów daty :

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);

Oto zestaw wyników. Wszystkie wyniki są typem 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. Zmienne i parametr daty

Poniższy przykład ilustruje użycie parametru daty :

DECLARE @d datetime2 = '1998-12-11 02:03:04.1234567';
SELECT DATETRUNC(day, @d);

Oto zestaw wyników.

1998-12-11 00:00:00.0000000

E. Kolumny i parametr daty

Kolumna TransactionDate z tabeli Sales.CustomerTransactions służy jako przykładowy argument kolumnowy dla parametru daty :

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. Wyrażenia i parametr daty

Parametr daty akceptuje dowolne wyrażenie, które może rozwiązywać się na typ daty T-SQL lub dowolny liter łańcuchowy, który może rozwiązywać się na datetime2(7). Kolumna TransactionDate z tabeli Sales.CustomerTransactions służy jako sztuczny argument ilustrujący użycie wyrażenia dla parametru daty :

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. Przytnij datę do części daty , reprezentującej jej maksymalną precyzję

Jeśli datepart ma taką samą maksymalną dokładność jednostkową jak typ daty wejściowej, obcięcie daty wejściowej do tej części nie będzie miało efektu.

Przykład 1

DECLARE @d datetime = '2015-04-29 05:06:07.123';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(millisecond, @d);

Oto zestaw wyników. Wejściowy datetime i parametr obciętej daty są takie same.

Input     2015-04-29 05:06:07.123
Truncated 2015-04-29 05:06:07.123

Przykład 2

DECLARE @d date = '2050-04-04';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(day, @d);

Oto zestaw wyników. Wejściowy datetime i parametr obciętej daty są takie same.

Input     2050-04-04
Truncated 2050-04-04

Przykład 3: precyzja smalldatetime

Smalldatetime jest precyzyjny tylko do najbliższej minuty, mimo że ma pole na sekundy. Dlatego obcięcie go do najbliższej minuty lub sekundy nie miałoby żadnego efektu.

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);

Oto zestaw wyników. Wartość wejściowa smalldatetime jest taka sama jak obie obcięte wartości:

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

Przykład 4: precyzja czasu i daty

Czas daty jest dokładny tylko do 3,33 milisekundy. Dlatego skrócenie daty do milisekundy może dać wyniki inne niż oczekiwania użytkownika. Jednak ta wartość obcięta jest taka sama jak wewnętrznie przechowywana wartość daty .

DECLARE @d datetime = '2020-02-02 02:02:02.002';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(millisecond, @d);

Oto zestaw wyników. Skrócona data jest taka sama jak data zapisana. Może to różnić się od tego, czego się spodziewasz na podstawie oświadczenia DECLARE .

Input     2020-02-02 02:02:02.003
Truncated 2020-02-02 02:02:02.003

Uwagi

Błąd pojawia się, jeśli obcięcie daty próbuje cofnąć się do daty sprzed minimalnej daty obsługiwanej przez ten typ danych. Ten błąd występuje tylko przy użyciu części weekdatowej. Nie może się to zdarzyć przy użyciu iso_weekczęści datowej, ponieważ wszystkie typy dat T-SQL przypadkowo używają poniedziałku jako minimalnych dat. Oto przykład z odpowiadającym komunikatem o błędzie wyniku:

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.

Błąd DATEPART jest wyrzucany, jeśli DATETRUNC funkcja lub typ danych daty wejściowej nie obsługuje użytej części daty . Ten błąd może wystąpić, gdy:

  1. Używa się części datowej , która nie jest podparta ( DATETRUNC mianowicie weekday, tzoffset, lub nanosecond)

  2. Część datowa powiązana z czasem jest używana z typem danych daty, lub część datapowiązana z typem danych czasowych. Oto przykład z odpowiadającym komunikatem o błędzie wyniku:

    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. Część data wymaga wyższej precyzji skali czasowej ułamkowej niż obsługuje ten typ danych. Więcej informacji można znaleźć w artykule Dokładność skali czasowej ułamków. Oto przykład z odpowiadającym komunikatem o błędzie wyniku:

    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.