Partilhar via


Hora do encontro (Transact-SQL)

Aplica-se a:Banco de Dados SQL doAzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)Banco de Dados SQL no Microsoft Fabric

Define uma data que é combinada com uma hora do dia com segundos fracionários que se baseia em um relógio de 24 horas.

Evite usar datetime para novos trabalhos. Em vez disso, use o hora, data, datetime2e datetimeoffset tipos de dados. Esses tipos se alinham com o SQL Standard e são mais portáteis. hora, datetime2 e datetimeoffset fornecer mais segundos de precisão. datetimeoffset fornece suporte de fuso horário para aplicativos implantados globalmente.

Description

Property Value
Syntax DATETIME
Usage 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) até 9999-12-31 (31 de dezembro de 9999)
Intervalo de tempo 00:00:00 até 23:59:59.997
Intervalo de deslocamento de fuso horário None
Intervalos de elementos yyyy são quatro dígitos de 1753 a 9999 que representam um ano.

MM são dois dígitos, variando de 01 a 12, que representam um mês no ano especificado.

dd são dois dígitos, variando de 01 a 31 dependendo do mês, que representam um dia do mês especificado.

HH são 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 são dois dígitos, variando de 00 a 59, que representam o segundo.

n* é de zero a três dígitos, variando de 0 a 999, que representam os segundos fracionários.
Comprimento do caractere 19 posições no mínimo a 23 no máximo
Tamanho de armazenamento 8 bytes
Accuracy Arredondado para incrementos de .000, .003ou .007 segundos
Valor predefinido 1900-01-01 00:00:00
Calendar Gregoriano (inclui a gama completa de anos)
de precisão de segundo fracionário definido pelo usuário No
Reconhecimento de compensação de fuso horário e preservação No
Horário de verão ciente No

Formatos literais de cadeia de caracteres suportados para datetime

As tabelas a seguir listam os formatos literais de cadeia de caracteres suportados para datetime. Exceto para ODBC, literais de cadeia de caracteres de datetime estão entre aspas simples ('), por exemplo, 'string_literaL'. Se o ambiente não estiver us_english, os literais de cadeia de caracteres devem estar no formato Unicode N'string_literaL'.

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 use marcas de barra (/), hífenes (-) ou pontos (.) como separadores. Essa cadeia de caracteres deve aparecer 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 de 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 interpretadas incorretamente como fora do intervalo ou com valores errados. Por exemplo, 12/10/08 pode ser interpretada como uma das seis datas, dependendo da configuração DATEFORMAT. Um ano de quatro partes é interpretado como o ano.

Formato da data Order
[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 completo do mês. Por exemplo, April, ou a abreviatura do mês de Apr, especificado no idioma atual. As vírgulas são opcionais e a utilização de maiúsculas é ignorada.

Aqui estão algumas diretrizes para usar formatos de data alfabéticos:

  • Coloque os dados de data e hora entre aspas simples ('). Para outros idiomas além do inglês, use N''.

  • Os caracteres entre parênteses são opcionais.

  • Se você especificar apenas os dois últimos dígitos do ano, os valores inferiores aos dois últimos dígitos do valor da opção de configuração de de corte de dois dígitos estarão no mesmo século do ano de corte. Valores maiores ou iguais ao valor desta opção estão no século que antecede o ano de corte. Por exemplo, se de corte de ano de dois dígitos for 2050 (padrão), 25 será interpretado como 2025 e 50 será interpretado como 1950. Para evitar ambiguidades, use anos de quatro dígitos.

  • Se faltar o dia, é fornecido o primeiro dia do mês.

  • A configuração de sessão SET DATEFORMAT não é aplicada quando você especifica o mês em formato alfabético.

Alphabetical
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 T, os dois pontos (:) e o ponto (.) que são mostrados no formato.

Os parênteses indicam que a fração de segundo componente é opcional. O componente de tempo é especificado no formato de 24 horas. O indica o início da parte de hora do valor de datetime .

A vantagem em usar o formato ISO 8601 é que é uma norma internacional com especificação inequívoca. Além disso, esse formato não é afetado pela configuração SET DATEFORMAT ou SET LANGUAGE.

Examples:

  • 2004-05-23T14:25:10
  • 2004-05-23T14:25:10.487
Certificação ISO 8601
yyyy-MM-ddTHH:mm:ss[.mmm]
yyyyMMdd[ HH:mm:ss[.mmm]]

Formato não separado

Este formato é semelhante ao formato ISO 8601, exceto que não contém separadores de data.

Unseparated
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. Esse formato de carimbo de data/hora ODBC também é suportado pela definição de linguagem OLE DB (DBGUID-SQL) suportada pelo provedor Microsoft OLE DB para SQL Server. Os aplicativos que usam as APIs baseadas em ADO, OLE DB e ODBC podem usar esse formato de carimbo de data/hora 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' }

Arredondamento da precisão de segundo fracionário data/hora

valores de datetime são arredondados para incrementos de .000, .003ou .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);

Aqui está o conjunto de resultados.

Valor especificado pelo utilizador 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 ANSI e ISO 8601

datetime não é compatível com ANSI ou 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 funções CAST e 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 ocorre quando outros tipos de dados de data e hora são convertidos para o datetime tipo de dados.

Quando a conversão é de data, 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';

Aqui está 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 completar 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 time(n) valor é maior que três dígitos, o valor é truncado para ajustar. 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';

Aqui está 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 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';

Aqui está 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 está truncado. Quando a precisão fracionada do valor de 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';

Aqui está 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 fracionada 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';

Aqui está o conjunto de resultados.

@datetime                @datetime2
------------------------ -------------------------
1968-10-23 12:45:37.123  1968-10-23 12:45:37.1237

Examples

O exemplo a seguir compara os resultados da conversão de uma cadeia de caracteres a cada de data e hora tipo de dados.

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

Aqui está o conjunto de resultados.

Tipo de dados Output
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