Partilhar via


Data (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Ponto de Extremidade de Análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de Dados SQL no Microsoft Fabric

Define uma data no SQL Server. O tipo de dados de data foi introduzido no SQL Server 2008 (10.0.x).

Descrição da data

Property Value
Syntax DATE
Usage DECLARE @MyDate DATE

CREATE TABLE Table1 (Column1 DATE)
Formato literal de cadeia de caracteres padrão

(usado para cliente de nível inferior)
yyyy-MM-dd

Para obter mais informações, consulte a seção Compatibilidade com versões anteriores para clientes de nível inferior .
Range 0001-01-01 através de 9999-12-31 (1582-10-15 através da 9999-12-31 Informatica)

1 de janeiro de 1 d.C. (Era Comum) a 31 de dezembro de 9999 d.C. (15 de outubro de 1582 d.C. a 31 de dezembro de 9999 d.C. para Informática)
Intervalos de elementos yyyysão quatro dígitos a 0001 partir do 9999 que representam um ano. A Informatica limita yyyy o intervalo 1582 a 9999.

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

dd é de dois dígitos de 01 para 31, dependendo do mês, que representa um dia do mês especificado.
Comprimento da personagem 10 posições
Precisão, escala 10, 0
Tamanho de armazenamento 3 bytes, fixos
Estrutura de armazenamento Um inteiro de 3 bytes armazena a data
Accuracy Um dia
Valor predefinido 1900-01-01

Esse valor é usado para a parte de data anexada para conversão implícita de hora para datetime2 ou datetimeoffset.
Calendar Gregorian
Precisão de segundo fracionária definida pelo usuário No
Reconhecimento e preservação de deslocamento de fuso horário No
Aviso de horário de verão No

Formatos literais de cadeia de caracteres suportados para data

As listas a seguir mostram os formatos literais de cadeia de caracteres válidos para o tipo de dados de data .

[m]m, dde [yy]yy representam mês, dia e ano em uma cadeia de caracteres com barras (/), hífenes (-) ou pontos (.) como separadores.

Apenas anos de quatro dígitos ou dois dígitos são suportados. Use anos de quatro dígitos sempre que possível. Para especificar um inteiro de para que represente 0001 o ano de corte para interpretar anos de dois dígitos como anos de quatro dígitos, use a opção de configuração do servidor de corte de ano de 9999dois dígitos.

Para a Informatica, yyyy limita-se ao intervalo 1582 de 9999.

Um ano de dois dígitos que é menor ou igual aos dois últimos dígitos do ano de corte está no mesmo século que o ano de corte. Um ano de dois dígitos maior do que os dois últimos dígitos do ano de corte é no século que antecede o ano de corte. Por exemplo, se o ponto de corte do ano de dois dígitos for o padrão 2049, o ano 49 de dois dígitos será interpretado como 2049 e o ano 50 de dois dígitos será interpretado como 1950.

A configuração de idioma atual determina o formato de data padrão. Você pode alterar o formato de data usando as instruções SET LANGUAGE e SET DATEFORMAT .

O ydm formato não é suportado para a data.

Formatos literais de cadeia de caracteres para mês-dia-ano

SET DATEFORMAT mdy;
  • [m]m/dd/[yy]yy
  • [m]m-dd-[yy]yy

Formatos literais de cadeia de caracteres para mês-ano-dia

SET DATEFORMAT myd;
  • [m]m/[yy]yy/dd
  • [m]m-[yy]yy-dd
  • [m]m.[yy]yy.dd

Formatos literais de cadeia de caracteres para dia-mês-ano

SET DATEFORMAT dmy;
  • dd/[m]m/[yy]yy
  • dd-[m]m-[yy]yy
  • dd.[m]m.[yy]yy

Formatos literais de cadeia de caracteres para dia-ano-mês

SET DATEFORMAT dym;
  • dd/[yy]yy/[m]m
  • dd-[yy]yy-[m]m
  • dd.[yy]yy.[m]m

Formatos literais de cadeia de caracteres para ano-mês-dia

SET DATEFORMAT ymd;
  • [yy]yy/[m]m/dd
  • [yy]yy-[m]m-dd
  • [yy]yy-[m]m-dd

Lista alfabética de formatos

  • [dd] mon[,] yyyy
  • dd mon[,][yy]yy
  • dd [yy]yy mon
  • [dd] yyyy mon
  • mon [dd][,] yyyy
  • mon dd[,] [yy]
  • mon yyyy [dd]
  • yyyy mon [dd]
  • yyyy [dd] mon

mon representa o nome completo do mês, ou a abreviatura do mês, dado no idioma atual. As vírgulas são opcionais e a utilização de maiúsculas é ignorada.

Para evitar ambiguidades, use anos de quatro dígitos.

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

Lista de formatos ISO 8601

  • yyyy-MM-dd
  • yyyyMMdd

O mesmo que o padrão SQL. Este formato é o único definido como um padrão internacional.

Lista separada de formatos

  • [yy]yyMMdd
  • yyyy[MMdd]

Os dados de data podem ser especificados com quatro, seis ou oito dígitos. Uma cadeia de caracteres de seis ou oito dígitos é sempre interpretada como ymd. O mês e o dia devem ser sempre de dois dígitos. Uma cadeia de quatro dígitos é interpretada como o ano.

Formato de data ODBC

  • { d 'yyyy-MM-dd' }

Específico da API ODBC.

Formato de data XML W3C

  • yyyy-MM-ddTZD

Suportado para uso XML/SOAP.

TZDé o designador de fuso horário (Z ou +hh:mm-hh:mm ):

  • hh:mm representa o deslocamento de fuso horário. hh são dois dígitos, variando de 0 a 14, que representam o número de horas no deslocamento de fuso horário.

  • mm são dois dígitos, variando de 0 a 59, que representam o número de minutos adicionais no deslocamento de fuso horário.

  • + (mais) ou - (menos) é o sinal obrigatório da compensação de fuso horário. Este sinal indica que, para obter a hora local, o deslocamento de fuso horário é adicionado ou subtraído da hora UTC (Coordinated Universal Times). O intervalo válido de deslocamento de fuso horário é de -14:00 até +14:00.

Conformidade com ANSI e ISO 8601

data está em conformidade com a definição padrão ANSI SQL para o calendário gregoriano:

Os tipos de dados datetime permitem que as datas no formato gregoriano sejam armazenadas no intervalo de datas 0001-01-01 CE até 9999-12-31 CE.

O formato literal de cadeia de caracteres padrão, que é usado para clientes de nível inferior, está em conformidade com o formulário padrão SQL que é definido como yyyy-MM-dd. Este formato é o mesmo que a definição ISO 8601 para DATE.

Note

Para a Informatica, o intervalo é limitado a 1582-10-15 (15 de outubro de 1582 d.C.) a 9999-12-31 (31 de dezembro de 9999 d.C.).

Compatibilidade com versões anteriores para clientes de nível inferior

Alguns clientes de nível inferior não suportam os tipos de dados time, date, datetime2 e datetimeoffset. A tabela a seguir mostra o mapeamento de tipo entre uma instância de nível superior do SQL Server e clientes de nível inferior.

Tipo de dados do SQL Server Formato literal de cadeia de caracteres padrão passado para o cliente de nível inferior ODBC de nível inferior OLEDB de nível inferior JDBC de nível inferior SQLCLIENT de nível inferior
time hh:mm:ss[.nnnnnnn] SQL_WVARCHAR ou SQL_VARCHAR DBTYPE_WSTR ou DBTYPE_STR Java.sql.String String ou SqString
date yyyy-MM-dd SQL_WVARCHAR ou SQL_VARCHAR DBTYPE_WSTR ou DBTYPE_STR Java.sql.String String ou SqString
datetime2 yyyy-MM-dd HH:mm:ss[.nnnnnnn] SQL_WVARCHAR ou SQL_VARCHAR DBTYPE_WSTR ou DBTYPE_STR Java.sql.String String ou SqString
datetimeoffset yyyy-MM-dd HH:mm:ss[.nnnnnnn] [+ or -]hh:mm SQL_WVARCHAR ou SQL_VARCHAR DBTYPE_WSTR ou DBTYPE_STR Java.sql.String String ou SqString

Converter dados de data e hora

Quando você converte em tipos de dados de data e hora, o SQL Server rejeita todos os valores que não reconhece 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 data em outros tipos de data e hora

Esta seção descreve o que ocorre quando você converte um tipo de dados de data para outros tipos de dados de data e hora.

Quando a conversão é para time(n), a conversão falha e a mensagem de erro 206 é gerada:

Conflito de tipo de operando: a data é incompatível com a hora.

Se a conversão for para datetime, o componente date será copiado. O código a seguir mostra os resultados da conversão de um valor de data em um valor datetime .

DECLARE @date AS DATE = '12-10-25';

DECLARE @datetime AS DATETIME = @date;

SELECT @date AS '@date',
       @datetime AS '@datetime';

Aqui está o conjunto de resultados.

@date      @datetime
---------- -----------------------
2025-12-10 2025-12-10 00:00:00.000

Quando a conversão é para smalldatetime, o valor date está no intervalo de um smalldatetime, o componente date é copiado e o componente time é definido como 00:00:00.000. Quando o valor de data está fora do intervalo de um valor smalldatetime , a mensagem de erro 242 é gerada e o valor smalldatetime é definido como NULL:

A conversão de um tipo de dados de data para um tipo de dados smalldatetime resultou em um valor fora do intervalo.

O código a seguir mostra os resultados da conversão de um valor de data em um valor smalldatetime .

DECLARE @date AS DATE = '1912-10-25';

DECLARE @smalldatetime AS SMALLDATETIME = @date;

SELECT @date AS '@date',
       @smalldatetime AS '@smalldatetime';

Aqui está o conjunto de resultados.

@date      @smalldatetime
---------- -------------------
1912-10-25 1912-10-25 00:00:00

Para conversão para datetimeoffset(n), a data é copiada e a hora é definida como 00:00.0000000 +00:00. O código a seguir mostra os resultados da conversão de um valor de data em um valor datetimeoffset(3 ).

DECLARE @date AS DATE = '1912-10-25';

DECLARE @datetimeoffset AS DATETIMEOFFSET (3) = @date;

SELECT @date AS '@date',
       @datetimeoffset AS '@datetimeoffset';

Aqui está o conjunto de resultados.

@date      @datetimeoffset
---------- ------------------------------
1912-10-25 1912-10-25 00:00:00.000 +00:00

Quando a conversão é para datetime2(n), o componente de data é copiado e o componente de hora é definido como 00:00.000000. O código a seguir mostra os resultados da conversão de um valor de data em um valor datetime2(3).

DECLARE @date AS DATE = '1912-10-25';

DECLARE @datetime2 AS DATETIME2 (3) = @date;

SELECT @date AS '@date',
       @datetime2 AS '@datetime2(3)';

Aqui está o conjunto de resultados.

@date      @datetime2(3)
---------- -----------------------
1912-10-25 1912-10-25 00:00:00.000

Converter literais de cadeia de caracteres em data

Conversões de literais de cadeia de caracteres para tipos de data e hora são permitidas se todas as partes das cadeias de caracteres estiverem em formatos válidos. Caso contrário, um erro de tempo de execução é gerado. Conversões implícitas ou conversões explícitas que não especificam um estilo, de tipos de data e hora a literais de cadeia de caracteres, estão no formato padrão da sessão atual. A tabela a seguir mostra as regras para converter um literal de cadeia de caracteres para o tipo de dados de data .

Literal da cadeia de caracteres de entrada date
DATA ODBC Os literais de cadeia de caracteres ODBC são mapeados para o tipo de dados datetime . Qualquer operação de atribuição de literais ODBC DATETIME em um tipo de data causa uma conversão implícita entre datetime e o tipo que as regras de conversão definem.
ODBC TIME Consulte a regra DATE ODBC anterior.
ODBC DATA-HORA Consulte a regra DATE ODBC anterior.
Apenas DATA Trivial
SÓ TEMPO Os valores padrão são fornecidos.
Apenas FUSO HORÁRIO Os valores padrão são fornecidos.
DATA + HORA A parte DATE da cadeia de caracteres de entrada é usada.
DATA + FUSO HORÁRIO Não permitido.
HORA + FUSO HORÁRIO Os valores padrão são fornecidos.
DATA + HORA + FUSO HORÁRIO A parte DATE de DATETIME local é usada.

Examples

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

SELECT CAST ('2022-05-08 12:35:29.1234567 +12:15' AS TIME (7)) AS 'time',
       CAST ('2022-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
       CAST ('2022-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
       CAST ('2022-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
       CAST ('2022-05-08 12:35:29.1234567 +12:15' AS DATETIME2 (7)) AS 'datetime2',
       CAST ('2022-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 2022-05-08
smalldatetime 2022-05-08 12:35:00
datetime 2022-05-08 12:35:29.123
datetime2 2022-05-08 12:35:29.1234567
datetimeoffset 2022-05-08 12:35:29.1234567 +12:15