Sdílet prostřednictvím


DATETRUNC (Transact-SQL)

Platí na: SQL Server 2022 (16.x) Azure SQL Database AzureSQL Managed InstanceSQL analytics endpoint in Microsoft FabricWarehouse in Microsoft FabricSQL database in Microsoft Fabric

Funkce vrací DATETRUNCvstupní datum zkrácené na určenou datovou část.

Poznámka:

DATETRUNC byl představen v SQL Server 2022 (16.x).

Syntaxe

DATETRUNC ( datepart , date )

Arguments

datepart

Specifikuje přesnost pro ořezání. Tato tabulka uvádí všechny platné hodnoty datepart pro DATETRUNC, za předpokladu, že je také platnou součástí vstupního typu data.

datepart Abbreviations Poznámky k ořezání
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y dayofyear je zkráceno stejným způsobem jako day
day dd, d day je zkráceno stejným způsobem jako dayofyear
week wk, ww Zkraťte to na první den v týdnu. V T-SQL je první den týdne definován nastavením @@DATEFIRST T-SQL. Pro prostředí americké angličtiny se @@DATEFIRST výchozí nastavení nastaví na 7 (Sunday).
iso_week isowk, isoww Zkraťte na první den ISO týdne. Prvním dnem v týdnu v kalendáři ISO8601 je pondělí.
hour hh
minute mi, n
second ss, s
millisecond ms
microsecond mcs

Poznámka:

Datové části pro pracovní dny, časové zóny a nanosekundové T-SQL datové části nejsou podporovány pro DATETRUNC.

date

Přijímá jakýkoli výraz, sloupec nebo uživatelem definovanou proměnnou, která může vyřešit na jakýkoli platný T-SQL typ data nebo času. Platné typy jsou:

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

Nepleťte parametr data s datovým typem.

DATETRUNCtaké přijímá literál řetězce (libovolného typu řetězce), který může vyřešit na datetime2(7).

Návratové typy

Vrácený datový typ pro je DATETRUNC dynamický. DATETRUNC vrací zkrácené datum stejného datového typu (a pokud je to relevantní, stejného zlomkového časového měřítka) jako vstupní datum. Například pokud DATETRUNC by dostal datetimeoffset(3) vstupní datum, vrátil by datetimeoffset(3). Pokud by mu byl přiřazen literál řetězce, DATETRUNC který by se mohl vyřešit na datetime2(7), vrátil by datetime2(7).

Přesnost na zlomkové časové škále

Milisekundy mají zlomkový časový rozsah 3 (.123), mikrosekundy mají zlomkový časový rozsah 6 (.123456), a nanosekundy mají zlomkové časové měřítko 9 (.123456789). Datové typy čas, datetime2 a datetimeoffset umožňují maximální zlomkový časový rozsah 7 (.1234567). Proto pro zkrácení na milliseconddatovou část musí být zlomková časová škála alespoň 3. Podobně, pro zkrácení na microseconddatovou část musí být zlomková časová škála alespoň 6. DATETRUNCnepodporuje datepart, nanosecond protože žádný T-SQL typ data nepodporuje zlomkový časový rozsah 9.

Examples

A. Použijte různé možnosti datových částí

Následující příklady ilustrují použití různých možností datových částí :

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

Tady je soubor výsledků.

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 prostředí

Následující příklady ilustrují použití @@DATEFIRST nastavení s datovou částíweek:

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

Tady je soubor výsledků.

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. Datové literály

Následující příklady ilustrují použití literálů parametrů datu :

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

Tady je soubor výsledků. Všechny výsledky jsou typu 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. Proměnné a parametr data

Následující příklad ilustruje použití parametru data :

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

Tady je soubor výsledků.

1998-12-11 00:00:00.0000000

E. Sloupce a parametr data

Sloupec TransactionDate z tabulky Sales.CustomerTransactions slouží jako příklad sloupcového argumentu pro parametr data :

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. Výrazy a parametr data

Parametr data přijímá jakýkoli výraz, který může být vyložen na T-SQL typ data, nebo jakýkoli stringový literál, který se dokáže rozlišit na datetime2(7). Sloupec TransactionDate z tabulky Sales.CustomerTransactions slouží jako umělý argument k ilustraci použití výrazu pro parametr data :

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. Zkrácejte datum na datepart reprezentující jeho maximální přesnost

Pokud má datová část stejnou jednotkovou maximální přesnost jako vstupní datový typ, zkrácení vstupního data na tuto datovou část nebude mít žádný vliv.

Příklad 1

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

Tady je soubor výsledků. Vstupní datetime a parametr zkráceného data jsou stejné.

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

Příklad 2

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

Tady je soubor výsledků. Vstupní datetime a parametr zkráceného data jsou stejné.

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

Příklad 3: přesnost malého data

Smalldatetime je přesný jen do nejbližší minuty, i když má pole pro sekundy. Proto by zkrácení na nejbližší minutu nebo sekundu nemělo žádný efekt.

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

Tady je soubor výsledků. Vstupní hodnota smalldatetime je stejná jako obě zkrácené hodnoty:

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

Příklad 4: přesnost data a času

Datum je přesný pouze do 3,33 milisekundy. Proto zkrácení času na milisekundu může vést k výsledkům odlišným od očekávání uživatele. Tato zkrácená hodnota je však stejná jako interně uložená hodnota datového času .

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

Tady je soubor výsledků. Zkrácené datum je stejné jako uložené datum. To může být jiné, než co očekáváte na základě tvrzení.DECLARE

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

Poznámky

Chyba se zobrazí, pokud se zkrácení data pokusí vrátit zpět k datu před minimálním datem podporovaným daným datovým typem. Tato chyba se vyskytuje pouze při použití datepartuweek. Nemůže k tomu dojít při použití datepart, iso_week protože všechny T-SQL typy dat náhodou používají pondělí jako minimální data. Zde je příklad s odpovídající chybovou zprávou o výsledku:

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.

Chyba DATEPART se vyhodí, pokud DATETRUNC funkce nebo vstupní datový typ nepodporuje použitou datovou část . Tato chyba může nastat, když:

  1. Používá se datepart , který není podpořen ( DATETRUNC konkrétně weekday, tzoffset, nebo nanosecond)

  2. Časově související datová část se používá s datovým typem nebodatováčást související s časovým datovým typem. Zde je příklad s odpovídající chybovou zprávou o výsledku:

    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. Datová část vyžaduje vyšší přesnost v zlomkové časové škále, než jakou podporuje datový typ. Pro více informací viz Přesnost na zlomkové časové škále. Zde je příklad s odpovídající chybovou zprávou o výsledku:

    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.