Compartilhar via


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_englishfor, 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, use N''.

  • 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 como 2025 e 50 é interpretado como 1950. 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 Tdois-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 data
    • t = apenas tempo
    • ts = 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