Aracılığıyla paylaş


DATETRUNC (Transact-SQL)

Şunlar için geçerlidir: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL analytics endpoint in Microsoft FabricWarehouse in Microsoft FabricSQL database in Microsoft Fabric

Fonksiyon, DATETRUNC belirli bir tarih parçasına kısaltılmış bir giriş tarihini döndürür.

Uyarı

DATETRUNC SQL Server 2022 (16.x) ile tanıtıldı.

Sözdizimi

DATETRUNC ( datepart , date )

Arguments

datepart

Kesinti hassasiyetini belirtir. Bu tablo, giriş tarih türünün geçerli bir parçası olduğu sürece tüm DATETRUNCgeçerli datepart değerlerini listeler.

datepart Abbreviations Kısaltma notları
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y dayofyear kısaltılmış gibi day
day dd, d day kısaltılmış gibi dayofyear
week wk, ww Haftanın ilk gününe kadar kısalt. T-SQL'de haftanın ilk günü T-SQL ayarı ile tanımlanır @@DATEFIRST . ABD İngilizcesi ortamında @@DATEFIRST varsayılan olarak (Pazar) olarak yazılır 7 .
iso_week isowk, isoww ISO haftasının ilk gününe kadar kısaltın. ISO8601 takvim sisteminde haftanın ilk günü Pazartesi'dir.
hour hh
minute mi, n
second ss, s
millisecond ms
microsecond mcs

Uyarı

Hafta içi gün, zaman bölgesi ofseti ve nanosaniye T-SQL tarih bölümleri desteklenmiyorDATETRUNC.

date

Herhangi bir geçerli T-SQL tarih veya saat türüne çözümlenebilen herhangi bir ifade, sütun veya kullanıcı tanımlı değişkeni kabul eder. Geçerli türler şunlardır:

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

Tarih parametresini tarih veri tipiyle karıştırmayın.

DATETRUNC ayrıca datetime2(7) ile çözümlenebilen herhangi bir dizi dize literalini de kabul eder.

Dönüş türleri

Döndürülen veri tipi dinamiktir DATETRUNC . DATETRUNC giriş tarihiyle aynı veri türüne (ve varsa, aynı kesirli zaman ölçeğine) sahip kesiklenmiş bir tarih döndürür. Örneğin, DATETRUNC bir datetimeoffset(3) giriş tarihi verildiyse, datetimeoffset(3) döner. Eğer datetime2(7) olarak çözümlenebilen bir dizi verilseydi, DATETRUNCdatetime2(7) dönerdi.

Kesiyel zaman ölçeği hassasiyeti

Milisaniyelerin kesirli zaman ölçeği 3 (.123), mikrosaniyelerin kesirli zaman ölçeği 6 (.123456), nanosaniyelerin kesirli zaman ölçeği ise 9 (.123456789). Time, datetime2 ve datetimeoffset veri türleri, maksimum kesirli zaman ölçeğine 7 (.1234567). izin verir. Bu nedenle, tarih parçasına kısaltmak millisecond için kesirli zaman ölçeğinin en az 3 olması gerekir. Benzer şekilde, tarih parçasınamicrosecond kısaltmak için kesirli zaman ölçeği en az 6 olmalıdır. DATETRUNCtarih kısmınınanosecond desteklemiyor çünkü hiçbir T-SQL tarih türü 9 kısmi zaman ölçeğini desteklemiyor.

Örnekler

A. Farklı datepart seçenekleri kullanın

Aşağıdaki örnekler, çeşitli datepart seçeneklerinin kullanımını göstermektedir:

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

Sonuç kümesi aşağıdadır.

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 ortamı

Aşağıdaki örnekler, tarih kısmı ile birlikte @@DATEFIRST ortamın week kullanımını göstermektedir:

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

Sonuç kümesi aşağıdadır.

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. Tarih kelime harfi

Aşağıdaki örnekler, tarih parametre literallerinin kullanımını göstermektedir:

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

Sonuç kümesi aşağıdadır. Tüm sonuçlar datetime2(7) tipindedir.

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. Değişkenler ve tarih parametresi

Aşağıdaki örnek, tarih parametresinin kullanımını göstermektedir:

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

Sonuç kümesi aşağıdadır.

1998-12-11 00:00:00.0000000

E. Sütunlar ve tarih parametresi

Tablodaki Sales.CustomerTransactions sütunTransactionDate, tarih parametresi için örnek bir sütun argümanı olarak hizmet verir:

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. İfadeler ve tarih parametresi

Date parametresi, T-SQL tarih türüne çözümlenebilen herhangi bir ifadeyi veya datetime2(7) ile çözümlenebilen herhangi bir dize literalini kabul eder. Tablodaki Sales.CustomerTransactions sütun, TransactionDatetarih parametresi için bir ifadenin kullanımını örnekleyen yapay bir argüman olarak hizmet verir:

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. Bir tarihi , maksimum hassasiyetini temsil eden bir tarih parçasına kısaltın

Eğer datepart, giriş tarih tipiyle aynı bir maksimum hassasiyete sahipse, giriş tarihini bu datepart'a kısaltmak hiçbir etki yaratmaz.

Örnek 1

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

Sonuç kümesi aşağıdadır. Giriş tarih saati ve kısaltılmış tarih parametresi aynıdır.

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

Örnek 2

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

Sonuç kümesi aşağıdadır. Giriş tarih saati ve kısaltılmış tarih parametresi aynıdır.

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

Örnek 3: küçük tarih hassasiyeti

smalldatetime sadece en yakın dakikaya kadar kesindir, saniyeler için bir alanı olsa bile. Bu nedenle, en yakın dakikaya ya da en yakın saniyeye kısaltmak hiçbir etkisi olmazdı.

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

Sonuç kümesi aşağıdadır. Girdi smalldatetime değeri, kesilen her iki değerle aynıdır:

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

Örnek 4: tarih saati hassasiyeti

Datetime sadece 3.33 milisaniyeye kadar kesindir. Bu nedenle, bir tarih saatini milisaniyeye kısaltmak, kullanıcının beklediğinden farklı sonuçlar verebilir. Ancak, bu kısaltılmış değer, dahili olarak saklanan tarih saati değeriyle aynıdır.

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

Sonuç kümesi aşağıdadır. Kısaltılmış tarih, saklanan tarihle aynıdır. Bu, ifadeye DECLARE göre beklediğinizden farklı olabilir.

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

Açıklamalar

Tarih kesintisi, o veri türünün desteklediği minimum tarihten önceki bir tarihe geri gitmeye çalışırsa hata oluşur. Bu hata yalnızca datepart kullanılırken week meydana gelir. Datepart kullanılırken iso_week bu durum oluşamaz, çünkü tüm T-SQL tarih türleri tesadüfen minimum tarihleri için Pazartesi kullanır. İşte karşılık gelen sonuç hata mesajıyla bir örnek:

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 Fonksiyon veya giriş tarihi veri türü kullanılan tarih parçasını desteklemiyorsa DATETRUNC hata atılır. Bu hata şu durumlarda meydana gelebilir:

  1. Desteklenmeyen DATETRUNCbir datepart kullanılır (yani, weekday, tzoffset, veya nanosecond)

  2. Zamanla ilgili dateparttarih veri tipiyle veya tarihle ilgili datepartzaman veri tipiyle kullanılır. İşte karşılık gelen sonuç hata mesajıyla bir örnek:

    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. Datepart, veri türünün desteklediğinden daha yüksek kesirli zaman ölçeği hassasiyeti gerektirir. Daha fazla bilgi için bkz. Kesiyel zaman ölçeği hassasiyeti. İşte karşılık gelen sonuç hata mesajıyla bir örnek:

    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.