Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: SQL Server 2022 (16.x)
Azure SQL Database
AzureSQL Managed
Instance SQL Analytics endpoint em Microsoft Fabric
Warehouse em Microsoft Fabric
SQL 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:
Uma parte de data não suportada
DATETRUNCpor é usada (nomeadamente,weekday,tzoffset, ounanosecond)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.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.