Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Vonatkozik a következőkre: 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
A DATETRUNC függvény egy bemeneti dátumot ad vissza, amelyet egy megadott dátumra rövidítenek.
Megjegyzés:
DATETRUNC az SQL Server 2022-ben (16.x) jelent meg.
Szemantika
DATETRUNC ( datepart , date )
Arguments
datepart
Megadja a csonkítás pontosságát. Ez a táblázat felsorolja az összes érvényes datepart értéket , DATETRUNCfeltéve, hogy ez a bemeneti dátumtípus érvényes része is.
| datepart | Abbreviations | Rövidítési megjegyzések |
|---|---|---|
year |
yy, yyyy |
|
quarter |
qq, q |
|
month |
mm, m |
|
dayofyear |
dy, y |
dayofyear ugyanúgy lerövidítik, mint day |
day |
dd, d |
day ugyanúgy lerövidítik, mint dayofyear |
week |
wk, ww |
Rövidítsd meg a hét első napjára. A T-SQL-ben a hét első napját a @@DATEFIRST T-SQL beállítás határozza meg. Egy amerikai angol környezetben alapértelmezés @@DATEFIRST7 szerint (vasárnap) lesz. |
iso_week |
isowk, isoww |
Rövidítsd meg az ISO hét első napjára. A ISO8601 naptári rendszerben a hét első napja hétfő. |
hour |
hh |
|
minute |
mi, n |
|
second |
ss, s |
|
millisecond |
ms |
|
microsecond |
mcs |
Megjegyzés:
A hétköznap, időzóna eltolás és nanoszekundumos T-SQL dátumrészek nem támogatottak .DATETRUNC
date
Elfogad bármilyen kifejezést, oszlopot vagy felhasználó által definiált változót, amely bármely érvényes T-SQL dátum- vagy időponttípusra képes feloldani. Érvényes típusok:
- smalldatetime
- datetime
- date
- time
- datetime2
- datetimeoffset
Ne keverd össze a dátum paramétert a dátum adattípussal.
DATETRUNC Elfogad egy string literált is (bármilyen stringtípusból), amely DateTime2(7)-re is feloldható.
Visszatérési típusok
A visszaadott adattípus dinamikus DATETRUNC .
DATETRUNC ugyanannak az adattípusnak (és ha van megfelelően, ugyanannak a törtidőskála) lerövidített dátumát adja vissza, mint a bemeneti dátum. Például, ha DATETRUNC megadnának egy datetimeoffset(3) bemeneti dátumot, akkor egy datetimeoffset(3) értéket adna. Ha egy sorsort adnának, amely datetime2(7)-re oldható meg DATETRUNC , akkor datetime2(7)-t adna.
Tört időskála pontosság
A milliszekundumok törtidőskálája 3 (.123), a mikroszekundumusték törtidőskálája 6 (.123456), a nanoszekundumok törtidőskálája pedig 9 (.123456789).
A time, datetime2 és datetimeoffset adattípusok maximális törtidőskálát engednek 7 (.1234567). Ezért, hogy a dátumrészhez lerövidítsükmillisecond, a törtidőskálának legalább 3-nak kell lennie. Hasonlóképpen, a dátumrészre való rövidítéshez microsecond a törtidőskálának legalább 6-nak kell lennie.
DATETRUNC nem támogatja a nanoseconddatepartot , mivel egyetlen T-SQL date típus sem támogat egy 9-es töredékes időskálát.
Példák
A. Használj különböző dátumparti opciókat
Az alábbi példák szemlélteti a különböző dátumparti opciók használatát:
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);
Itt van az eredmények összessége.
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 környezet
Az alábbi példák szemlélteti a @@DATEFIRST beállítás használatát a weekdatepart segítségével:
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);
Itt van az eredmények összessége.
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. Dátum szó szerinti szavak
Az alábbi példák szemléltették a dátumparaméter literálisok használatát:
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);
Itt van az eredmények összessége. Minden eredmény datetime2(7) típusú.
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. Változók és a dátumparaméter
Az alábbi példa szemlélteti a dátumparaméter használatát:
DECLARE @d datetime2 = '1998-12-11 02:03:04.1234567';
SELECT DATETRUNC(day, @d);
Itt van az eredmények összessége.
1998-12-11 00:00:00.0000000
E. Oszlopok és a dátumparaméter
A táblázat oszlopa TransactionDateSales.CustomerTransactions példa oszlopargumentumként szolgál a dátumparaméterhez:
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. Kifejezések és dátumparaméter
A date paraméter bármilyen olyan kifejezést elfogad, amely képes feloldani egy T-SQL date típusra, vagy bármely string literálist, amely datetime2(7)-re oldható. A TransactionDate táblázat oszlopa Sales.CustomerTransactions mesterséges érvként szolgál, amely példát szolgál egy kifejezés használatát a dátumparaméterhez :
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. Rövidítsd le a dátumot egy dátum részére , amely a maximális pontosságát képviseli
Ha a datepart egység maximális pontossága megegyezik, mint a bemeneti dátumtípus, akkor a bemeneti dátum lerövidítése ehhez a dátumrészhez nem hat.
1. példa
DECLARE @d datetime = '2015-04-29 05:06:07.123';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(millisecond, @d);
Itt van az eredmények összessége. A bemeneti dátumidő és a levágott dátum paraméter ugyanaz.
Input 2015-04-29 05:06:07.123
Truncated 2015-04-29 05:06:07.123
2. példa
DECLARE @d date = '2050-04-04';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(day, @d);
Itt van az eredmények összessége. A bemeneti dátumidő és a levágott dátum paraméter ugyanaz.
Input 2050-04-04
Truncated 2050-04-04
3. példa: smalldatetime pontosság
a smalldatetime csak a legközelebbi percig precíz, még akkor is, ha másodpercekre is van mezője. Ezért a legközelebbi percig vagy a legközelebbi másodpercig történő lerövidítése nem lenne hatása.
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);
Itt van az eredmények összessége. A bemeneti smalldatetime érték ugyanaz, mint mindkét levágott érték:
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
4. példa: dátumidő pontossága
A dátum csak 3,33 milliszekundumig precíz. Ezért egy dátumidőpont lerövidítése egy milliszekundumra olyan eredményeket eredményezhet, amelyek eltérnek attól, amit a felhasználó vár. Ez a levágott érték azonban megegyezik a belső tárolt dátumidő értékével.
DECLARE @d datetime = '2020-02-02 02:02:02.002';
SELECT 'Input', @d;
SELECT 'Truncated', DATETRUNC(millisecond, @d);
Itt van az eredmények összessége. A levágott dátum megegyezik a tárolt dátummal. Ez más, mint amit a DECLARE kijelentés alapján vársz.
Input 2020-02-02 02:02:02.003
Truncated 2020-02-02 02:02:02.003
Megjegyzések
Hiba akkor történik, ha a dátum csonkítása megpróbál visszamenni egy olyan dátumra, amely megelőzi az adott adattípus által támogatott minimális dátumot. Ez a hiba csak a datepart használatakor week fordul elő. Ez nem fordulhat elő a datepart használatakoriso_week, mivel minden T-SQL dátumtípus véletlenül hétfőt használ a minimum dátumoknak. Íme egy példa a megfelelő eredményhibaüzenettel:
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.
DATEPART Hiba akkor jelenik meg, ha a DATETRUNC függvény vagy a bemeneti dátum adattípusa nem támogatja a használt dátumrészt. Ez a hiba akkor fordulhat elő, ha:
Olyan datepart használata, amelyet nem támogat
DATETRUNC(nevezetesen,weekday,tzoffset, vagynanosecond)Az időhöz kapcsolódó datepart a dátum adattípusához, vagy dátumhoz kapcsolódó datepart az időadattípushoz. Íme egy példa a megfelelő eredményhibaüzenettel:
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.A datepart nagyobb törtidőskála-pontosságot igényel, mint amit az adattípus támogat. További információért lásd: Törtidőskála pontosság. Íme egy példa a megfelelő eredményhibaüzenettel:
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.