Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí na: 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
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ž:
Používá se datepart , který není podpořen (
DATETRUNCkonkrétněweekday,tzoffset, nebonanosecond)Č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.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.