Partilhar via


DATETRUNC (Transact-SQL)

Aplica-se a: SQL Server 2022 (16.x) Azure SQL Database AzureSQL ManagedInstance SQL Analytics endpoint em Microsoft FabricWarehouse em Microsoft FabricSQL database em Microsoft Fabric

A DATETRUNC função devolve uma data de entrada truncada para uma data especificada.

Observação

DATETRUNC foi introduzido no SQL Server 2022 (16.x).

Sintaxe

DATETRUNC ( datepart , date )

Arguments

datepart

Especifica a precisão para truncamento. Esta tabela lista todos os valores válidos de datapart para DATETRUNC, dado que também é uma parte válida do tipo de data de entrada.

datepart Abbreviations Notas de truncamento
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y dayofyear é truncado da mesma forma que day
day dd, d day é truncado da mesma forma que dayofyear
week wk, ww Reduz para o primeiro dia da semana. No T-SQL, o primeiro dia da semana é definido pela @@DATEFIRST definição T-SQL. Para um ambiente inglês nos EUA, @@DATEFIRST por defeito é 7 (domingo).
iso_week isowk, isoww Reduza para o primeiro dia de uma semana ISO. O primeiro dia da semana no sistema de calendário ISO8601 é segunda-feira.
hour hh
minute mi, n
second ss, s
millisecond ms
microsecond mcs

Observação

O dia da semana, o timezoneoffset e as datas T-SQL de nanossegundos não são suportados para DATETRUNC.

date

Aceita qualquer expressão, coluna ou variável definida pelo utilizador que possa ser resolvida para qualquer tipo válido de data ou hora T-SQL. Tipos válidos são:

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

Não confundas o parâmetro de data com o tipo de dado de data .

DATETRUNC também aceita um literal de cadeia (de qualquer tipo) que pode resolver para um datetime2(7).

Tipos de devolução

O tipo de dado devolvido para DATETRUNC é dinâmico. DATETRUNC devolve uma data truncada do mesmo tipo de dado (e, se aplicável, da mesma escala temporal fracionária) que a data de entrada. Por exemplo, se DATETRUNC lhe fosse atribuída uma data de entrada datatimetimeoffset(3), devolveria um datetimeoffset(3). Se lhe fosse dado um literal de string que pudesse resolver para um datetime2(7), DATETRUNC retornaria um datetime2(7).

Precisão fracionária na escala temporal

Os milissegundos têm uma escala fracionária de tempo de 3 (.123), os microssegundos têm uma escala fracionária de 6 (.123456), e os nanossegundos têm uma escala fracionária de 9 (.123456789). Os tipos de dados time, datetime2 e datetimeoffset permitem uma escala temporal fracionária máxima de 7 (.1234567). Portanto, para truncar até à milliseconddata de data, a escala fracionária de tempo deve ser pelo menos 3. De forma semelhante, para truncar à microsecondparte da data, a escala fracionária de tempo deve ser pelo menos 6. DATETRUNC não suporta a nanoseconddatapart porque nenhum tipo de data T-SQL suporta uma escala temporal fracionária de 9.

Examples

A. Use diferentes opções de partes de datas

Os exemplos seguintes ilustram a utilização de várias opções de datas :

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

Aqui está o conjunto de resultados.

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 cenário

Os exemplos seguintes ilustram o uso da @@DATEFIRST configuração com a weekdata de data:

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

Aqui está o conjunto de resultados.

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. Datas literais

Os exemplos seguintes ilustram a utilização de literais de parâmetros de data :

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

Aqui está o conjunto de resultados. Todos os resultados são do tipo 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. Variáveis e o parâmetro de data

O exemplo seguinte ilustra a utilização do parâmetro de data :

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

Aqui está o conjunto de resultados.

1998-12-11 00:00:00.0000000

E. Colunas e o parâmetro de data

A TransactionDate coluna da Sales.CustomerTransactions tabela serve como exemplo de argumento de coluna para o parâmetro de 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. Expressões e o parâmetro de data

O parâmetro date aceita qualquer expressão que possa resolver para um tipo de data T-SQL ou qualquer literal de cadeia que possa resolver para um datetime2(7). A TransactionDate coluna da Sales.CustomerTransactions tabela serve como argumento artificial para exemplificar o uso de uma expressão para o parâmetro de 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. Trunque uma data para uma parte de data que representa a sua máxima precisão

Se a parte de data tiver a mesma precisão máxima unitária do tipo de data de entrada, truncar a data de entrada para esta parte de data não teria efeito.

Exemplo 1

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

Aqui está o conjunto de resultados. A data-hora de entrada e o parâmetro de data truncada são os mesmos.

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

Exemplo 2

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

Aqui está o conjunto de resultados. A data-hora de entrada e o parâmetro de data truncada são os mesmos.

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

Exemplo 3: precisão smalldatetime

smalldatetime só é preciso até ao minuto mais próximo, mesmo tendo um campo para segundos. Portanto, truncá-lo para o minuto ou segundo mais próximo não teria efeito.

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

Aqui está o conjunto de resultados. O valor de entrada smalldatetime é o mesmo que ambos os valores truncados:

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

Exemplo 4: precisão de data e hora

a hora de data só é precisa até 3,33 milissegundos. Portanto, truncar uma data-tempo para um milissegundo pode produzir resultados diferentes do que o utilizador espera. No entanto, este valor truncado é o mesmo que o valor de data-hora armazenado internamente.

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

Aqui está o conjunto de resultados. A data truncada é a mesma que a data armazenada. Isto pode ser diferente do que esperas com base na afirmação DECLARE .

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

Observações

É lançado um erro se o truncamento de datas tentar recuar até uma data anterior à data mínima suportada por esse tipo de dado. Este erro só ocorre ao usar a weekdatapart. Não pode acontecer ao usar a iso_weekdatapart, já que todos os tipos de data T-SQL usam uma segunda-feira como datas mínimas. Aqui está um exemplo com a correspondente mensagem de erro de resultado:

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.

É lançado um DATEPART erro se a DATETRUNC função, ou o tipo de data de entrada, não suportar a parte de data utilizada. Este erro pode ocorrer quando:

  1. Uma parte de data não suportada DATETRUNC por é usada (nomeadamente, weekday, tzoffset, ou nanosecond)

  2. Uma parte data-relacionada com o tempo é usada com o tipo de dados de dataou umaparte de data relacionada com a data é usada com o tipo de data de tempo. Aqui está um exemplo com a correspondente mensagem de erro de resultado:

    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 datapart requer uma precisão fracionária na escala temporal superior à que o tipo de dados suporta. Para mais informações, veja Precisão fracionária na escala temporal. Aqui está um exemplo com a correspondente mensagem de erro de resultado:

    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.