Megosztás a következőn keresztül:


DATETRUNC (Transact-SQL)

Vonatkozik a következőkre: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL analytics endpoint in Microsoft FabricWarehouse in Microsoft Fabric SQLdatabase 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:

  1. Olyan datepart használata, amelyet nem támogat DATETRUNC (nevezetesen, weekday, tzoffset, vagy nanosecond)

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