datetime (Transact-SQL)
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW)
Define uma data combinada com uma hora do dia que inclui frações de segundos e se baseia em um período de 24 horas.
Evite usar datetime para novos trabalhos. Em vez disso, use os tipos de dados time, date, datetime2 e datetimeoffset . Esses tipos se alinham com o padrão SQL e são mais portáteis. time, datetime2 e datetimeoffset fornecem mais precisão de segundos. datetimeoffset é compatível com fuso horário para aplicativos implantados globalmente.
Descrição
Propriedade | Valor |
---|---|
Sintaxe | DATETIME |
Uso | DECLARE @MyDatetime DATETIME; CREATE TABLE Table1 (Column1 DATETIME); |
Formatos literais de cadeia de caracteres padrão (usados para cliente de nível inferior) | Não aplicável |
Intervalo de datas | 1753-01-01 (1º de janeiro de 1753) a 9999-12-31 (31 de dezembro de 9999) |
Intervalo de tempo | 00:00:00 a 23:59:59.997 |
Intervalo de deslocamento de fuso horário | Nenhum |
Intervalos de elementos | yyyy é de quatro dígitos de através 9999 que 1753 representam um ano.MM é de dois dígitos, variando de 01 a 12 , que representam um mês no ano especificado.dd é dois dígitos, variando de 01 a 31 dependendo do mês, que representam um dia do mês especificado.HH é dois dígitos, variando de 00 a 23 , que representam a hora.mm são dois dígitos, variando de 00 a 59 , que representam o minuto.ss é dois dígitos, variando de 00 a 59 , que representam o segundo.n* é de zero a três dígitos, variando de a 999 , que representam as frações de 0 segundo. |
Comprimento do caractere | 19 posições no mínimo e 23 no máximo |
Tamanho de armazenamento | 8 bytes |
Precisão | Arredondado para incrementos de .000 , .003 , ou .007 segundos |
Valor padrão | 1900-01-01 00:00:00 |
Calendar | Gregoriano (inclui o intervalo completo de anos) |
Precisão de segundo fracionário definida pelo usuário | Não |
Reconhecimento e preservação do deslocamento de fuso horário | Não |
Horário de verão ciente | Não |
Formatos de literais de cadeia de caracteres com suporte para datetime
As tabelas a seguir listam os formatos de literais de cadeia de caracteres com suporte para datetime. Com exceção do ODBC, os literais de cadeia de caracteres datetime estão entre aspas simples ('
), por exemplo, 'string_literaL'
. Se o ambiente não us_english
for, os literais de cadeia de caracteres devem estar no formato N'string_literaL'
Unicode.
Formato numérico
Você pode especificar dados de data com um mês numérico especificado. Por exemplo, 5/20/97
representa o vigésimo dia de maio de 1997. Ao usar o formato de data numérica, especifique o mês, o dia e o ano em uma cadeia de caracteres que usa barras (/
), hífens (-
) ou pontos (.
) como separadores. Essa cadeia de caracteres deve ser exibida da seguinte forma:
<number separator number separator number [time] [time]>
Quando o idioma é definido como us_english
, a ordem padrão para a data é mdy
(mês, dia, ano). Você pode alterar a ordem da data usando a instrução SET DATEFORMAT.
A configuração para SET DATEFORMAT
determina como os valores de data são interpretados. Se a ordem não corresponder à configuração, os valores não serão interpretados como datas. Datas fora de ordem podem ser mal interpretadas como fora do intervalo ou com valores errados. Por exemplo, 12/10/08
pode ser interpretado como uma das seis datas, dependendo da DATEFORMAT
configuração. Um ano de quatro partes é interpretado como o ano.
Formato de data | Pedido |
---|---|
[0]4/15/[19]96 |
mdy |
[0]4-15-[19]96 |
mdy |
[0]4.15.[19]96 |
mdy |
[0]4/[19]96/15 |
myd |
15/[0]4/[19]96 |
dmy |
15/[19]96/[0]4 |
dym |
[19]96/15/[0]4 |
ydm |
[19]96/[0]4/15 |
ymd |
Formato de hora |
---|
14:30 |
14:30[:20:997] |
14:30[:20.9] |
4am |
4 PM |
Formato alfabético
Você pode especificar dados de data com um mês especificado como o nome de mês cheio. Por exemplo, April
, ou a abreviação do mês de Apr
, especificada no idioma atual. As vírgulas são opcionais e não há diferenciação entre letras maiúsculas e minúsculas.
Aqui estão algumas diretrizes para o uso de formatos de data alfabéticos:
Coloque os dados de data e hora entre aspas simples (
'
). Para idiomas diferentes do inglês, useN''
.Os caracteres entre colchetes são opcionais.
Se você especificar apenas os dois últimos dígitos do ano, os valores menores que os dois últimos dígitos do valor da opção de configuração de corte de ano de dois dígitos estarão no mesmo século que o ano de corte. Os valores maiores ou iguais ao valor dessa opção estão no século anterior ao ano de corte. Por exemplo, se o corte de ano de dois dígitos for
2050
(padrão),25
é interpretado como2025
e50
é interpretado como1950
. Para evitar ambiguidade, use anos de quatro dígitos.Se o dia estiver ausente, o primeiro dia do mês será fornecido.
A
SET DATEFORMAT
configuração da sessão não é aplicada quando você especifica o mês em formato alfabético.
Em ordem alfabética |
---|
Apr[il] [15][,] 1996 |
Apr[il] 15[,] [19]96 |
Apr[il] 1996 [15] |
[15] Apr[il][,] 1996 |
15 Apr[il][,][19]96 |
15 [19]96 apr[il] |
[15] 1996 apr[il] |
1996 APR[IL] [15] |
1996 [15] APR[IL] |
Formato ISO 8601
Para usar o formato ISO 8601, você deve especificar cada elemento no formato, incluindo o , os T
dois-pontos (:
) e o ponto (.
) que são mostrados no formato.
Os parênteses indicam que o componente de fração de segundo é opcional. O componente de hora é especificado no formato de 24 horas. O T
indica o início da parte de hora do valor datetime .
A vantagem de usar o formato ISO 8601 é que ele é um padrão internacional com especificações inequívocas. Além disso, esse formato não é afetado SET DATEFORMAT
pela configuração ou SET LANGUAGE .
Exemplos:
2004-05-23T14:25:10
2004-05-23T14:25:10.487
ISO 8601 |
---|
yyyy-MM-ddTHH:mm:ss[.mmm] |
yyyyMMdd[ HH:mm:ss[.mmm]] |
Formato não separado
Esse formato é semelhante ao formato ISO 8601, exceto que não contém separadores de data.
Não separado |
---|
yyyyMMdd HH:mm:ss[.mmm] |
Formato ODBC
A API ODBC define sequências de escape para representar valores de data e hora que o ODBC chama de dados de carimbo de data/hora. Também há suporte para esse formato de carimbo de data/hora do ODBC na definição de idioma OLE DB (DBGUID-SQL) compatível com o provedor OLE DB do Microsoft para SQL Server. Os aplicativos que usam ADO, OLE DB e as APIs baseadas em ODBC podem usar esse formato de carimbo de data/hora de ODBC para representar datas e horas.
As sequências de escape de carimbo de data/hora ODBC são do formato: { <literal_type> '<constant_value>' }
:
<literal_type>
Especifica o tipo da sequência de escape. Os carimbos de data/hora têm três<literal_type>
especificadores:d
= apenas datat
= apenas tempots
= carimbo de data/hora (hora + data)
<constant_value>
é o valor da sequência de escape.<constant_value>
deve seguir estes formatos para cada<literal_type>
:d
:yyyy-MM-dd
t
:hh:mm:ss[.fff]
ts
:yyyy-MM-dd HH:mm:ss[.fff]
ODBC |
---|
{ ts '1998-05-02 01:23:56.123' } |
{ d '1990-10-02' } |
{ t '13:33:41' } |
Arredondando a precisão de segundo fracionário de datetime
Os valores de data e hora são arredondados para incrementos de .000
, .003
, ou .007
segundos, conforme mostrado no exemplo a seguir.
SELECT '01/01/2024 23:59:59.999' AS [User-specified value],
CAST('01/01/2024 23:59:59.999' AS DATETIME) AS [System stored value]
UNION SELECT '01/01/2024 23:59:59.998', CAST('01/01/2024 23:59:59.998' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.997', CAST('01/01/2024 23:59:59.997' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.996', CAST('01/01/2024 23:59:59.996' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.995', CAST('01/01/2024 23:59:59.995' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.994', CAST('01/01/2024 23:59:59.994' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.993', CAST('01/01/2024 23:59:59.993' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.992', CAST('01/01/2024 23:59:59.992' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.991', CAST('01/01/2024 23:59:59.991' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.990', CAST('01/01/2024 23:59:59.990' AS DATETIME);
Veja a seguir o conjunto de resultados.
Valor especificado pelo usuário | Valor armazenado pelo sistema |
---|---|
01/01/2024 23:59:59.999 |
2024-01-02 00:00:00.000 |
01/01/2024 23:59:59.998 01/01/2024 23:59:59.997 01/01/2024 23:59:59.996 01/01/2024 23:59:59.995 |
2024-01-01 23:59:59.997 |
01/01/2024 23:59:59.994 01/01/2024 23:59:59.993 01/01/2024 23:59:59.992 |
2024-01-01 23:59:59.993 |
01/01/2024 23:59:59.991 01/01/2024 23:59:59.990 |
2024-01-01 23:59:59.990 |
Conformidade com o ANSI e ISO 8601
datetime não está em conformidade com o ANSI nem com o ISO 8601.
Converter dados de data e hora
Quando você converte em tipos de dados de data e hora, o Mecanismo de Banco de Dados rejeita todos os valores que não pode reconhecer como datas ou horas. Para obter informações sobre como usar as CAST
funções and CONVERT
com dados de data e hora, consulte CAST e CONVERT.
Converter outros tipos de data e hora para o tipo de dados datetime
Esta seção descreve o que acontece quando outros tipos de dados de data e hora são convertidos no tipo de dados datetime.
Quando a conversão é de date, o ano, mês e dia são copiados. O componente de tempo é definido como 00:00:00.000
. O código a seguir mostra os resultados da conversão de um valor DATE
em um valor DATETIME
.
DECLARE @date DATE = '12-21-16';
DECLARE @datetime DATETIME = @date;
SELECT @datetime AS '@datetime', @date AS '@date';
Veja a seguir o conjunto de resultados.
@datetime @date
------------------------ -----------
2016-12-21 00:00:00.000 2016-12-21
O exemplo anterior usa um formato de data específico da região (MM-DD-YY
).
DECLARE @date DATE = '12-21-16';
Você deve atualizar o exemplo para corresponder ao formato da sua região.
Você também pode concluir o exemplo com o formato de data compatível com ISO 8601 (yyyy-MM-dd
). Por exemplo:
DECLARE @date DATE = '2016-12-21';
DECLARE @datetime DATETIME = @date;
SELECT @datetime AS '@datetime', @date AS '@date';
Quando a conversão é de time(n), o componente de tempo é copiado e o componente de data é definido como 1900-01-01
. Quando a precisão fracionária do valor time(n) é maior que três dígitos, o valor é truncado para caber. O exemplo a seguir mostra os resultados da conversão de um valor TIME(4)
em um valor DATETIME
.
DECLARE @time TIME(4) = '12:10:05.1237';
DECLARE @datetime DATETIME = @time;
SELECT @datetime AS '@datetime', @time AS '@time';
Veja a seguir o conjunto de resultados.
@datetime @time
------------------------ --------------
1900-01-01 12:10:05.123 12:10:05.1237
Quando a conversão é de smalldatetime, as horas e os minutos são copiados. Os segundos e segundos fracionários são definidos como 0
. O código a seguir mostra os resultados da conversão de um valor SMALLDATETIME
em um valor DATETIME
.
DECLARE @smalldatetime SMALLDATETIME = '12-01-16 12:32';
DECLARE @datetime DATETIME = @smalldatetime;
SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime';
Veja a seguir o conjunto de resultados.
@datetime @smalldatetime
------------------------ --------------------
2016-12-01 12:32:00.000 2016-12-01 12:32:00
Quando a conversão é de datetimeoffset(n), os componentes de data e hora são copiados. O fuso horário é truncado. Quando a precisão fracionária do valor datetimeoffset(n) é maior que três dígitos, o valor é truncado. O exemplo a seguir mostra os resultados da conversão de um valor DATETIMEOFFSET(4)
em um valor DATETIME
.
DECLARE @datetimeoffset DATETIMEOFFSET(4) = '1968-10-23 12:45:37.1234 +10:0';
DECLARE @datetime DATETIME = @datetimeoffset;
SELECT @datetime AS '@datetime', @datetimeoffset AS '@datetimeoffset';
Veja a seguir o conjunto de resultados.
@datetime @datetimeoffset
------------------------ -------------------------------
1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237 +10:0
Quando a conversão é de datetime2(n), a data e a hora são copiadas. Quando a precisão fracionária do valor datetime2(n) é maior que três dígitos, o valor é truncado. O exemplo a seguir mostra os resultados da conversão de um valor DATETIME2(4)
em um valor DATETIME
.
DECLARE @datetime2 DATETIME2(4) = '1968-10-23 12:45:37.1237';
DECLARE @datetime DATETIME = @datetime2;
SELECT @datetime AS '@datetime', @datetime2 AS '@datetime2';
Veja a seguir o conjunto de resultados.
@datetime @datetime2
------------------------ -------------------------
1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237
Exemplos
O exemplo a seguir compara os resultados da conversão de uma cadeia de caracteres em cada tipo de dados date e time.
SELECT CAST('2024-05-08 12:35:29.1234567 +12:15' AS TIME(7)) AS 'time',
CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
CAST('2024-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
CAST('2024-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIME2(7)) AS 'datetime2',
CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset';
Veja a seguir o conjunto de resultados.
Tipo de dados | Saída |
---|---|
time |
12:35:29.1234567 |
date |
2024-05-08 |
smalldatetime |
2024-05-08 12:35:00 |
datetime |
2024-05-08 12:35:29.123 |
datetime2 |
2024-05-08 12:35:29.1234567 |
datetimeoffset |
2024-05-08 12:35:29.1234567 +12:15 |