Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy do: SQL Server 2022 (16.x)
Azure SQL Database
AzureSQL Managed Instance
SQL Analytics endpoint in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL 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:
Używa się części datowej , która nie jest podparta (
DATETRUNCmianowicieweekday,tzoffset, lubnanosecond)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.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.