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
Base de Dados SQL do Azure
Azure SQL Managed Instance
Azure Synapse Analytics
Sistema de Plataforma de Análise (PDW)
Tenha cuidado ao permitir a conversão das suas cadeias de caracteres em tipos de dados DATE. A razão é que tais conversões são frequentemente não determinísticas.
Controla estas conversões não determinísticas tendo em conta as definições de SET LANGUAGE e SET DATEFORMAT.
SET LANGUAGE exemplo: Nome do mês em polaco
SET LANGUAGE Polish;
Uma cadeia de caracteres pode ser o nome de um mês. Mas o nome está em inglês, polaco, croata ou noutra língua? E, a sessão do utilizador será definida para a correspondência LANGUAGEcorreta?
Por exemplo, considere a palavra listopad, que é o nome de um mês. Mas o mês depende da linguagem que o sistema SQL acredita estar a ser usada:
- Se for polaco, então listopad traduz-se como mês 11 (novembro em inglês).
- Se for croata, então listopad traduz-se como mês 10 (outubro em inglês).
Exemplo de código de SET LANGUAGE
--SELECT alias FROM sys.syslanguages ORDER BY alias;
DECLARE @yourInputDate NVARCHAR(32) = '28 listopad 2018';
SET LANGUAGE Polish;
SELECT CONVERT(DATE, @yourInputDate) AS [SL_Polish];
SET LANGUAGE Croatian;
SELECT CONVERT(DATE, @yourInputDate) AS [SL_Croatian];
SET LANGUAGE English;
/*** Actual output: For the two months, note the 11 versus the 10.
SL_Polish
2018-11-28
SL_Croatian
2018-10-28
***/
SET DATEFORMAT exemplo
SET DATEFORMAT dmy;
O formato dmy anterior indica que uma sequência de data de exemplo '01-03-2018' seria interpretada como significando o primeiro dia de março do ano de 2018.
Se em vez disso fosse especificado mdy , então a mesma corda '01-03-2018' significaria o terceiro dia de janeiro de 2018.
E se o ymd fosse especificado, não há garantia de qual seria o resultado. O valor numérico de '2018' é demasiado grande para ser um dia.
Países/regiões específicas
No Japão e na China, é usado o DATEFORMATnome de ymd . As partes do formato estão numa sequência sensata de maior unidade a menor. Portanto, este formato resolve-se bem. Este formato é considerado o formato internacional . É internacional porque os quatro dígitos do ano são inequívocos, e nenhum país/região no mundo usa o formato arcaico do ydm.
Noutros países/regiões como Alemanha e França, o DATEFORMAT é dmy, que significa 'dd-mm-yyyy'. O formato dmy não se ordena bem, mas é uma sequência sensata da menor para a maior.
Os Estados Unidos, e os Estados Federados da Micronésia, são os únicos países/regiões que usam o MDY, que não é classificado. A sequência mista do formato corresponde a um padrão de fala verbal nas datas faladas.
Exemplo em código de SET DATEFORMAT: mdy versus dmy
O seguinte exemplo de código Transact-SQL usa a mesma cadeia de caracteres de data com três definições diferentes DATEFORMAT . Uma execução do código produz a saída mostrada no comentário:
DECLARE @yourDateString NVARCHAR(10) = '12-09-2018';
PRINT @yourDateString + ' = the input.';
SET DATEFORMAT dmy;
SELECT CONVERT(DATE, @yourDateString) AS [DMY-Interpretation-of-input-format];
SET DATEFORMAT mdy;
SELECT CONVERT(DATE, @yourDateString) AS [MDY-Interpretation-of-input-format];
SET DATEFORMAT ymd;
SELECT CONVERT(DATE, @yourDateString) AS [YMD-Interpretation--?--NotGuaranteed];
/*** Actual output:
12-09-2018 = the input.
DMY-Interpretation-of-input-format
2018-09-12
MDY-Interpretation-of-input-format
2018-12-09
YMD-Interpretation--?--NotGuaranteed
2018-12-09
***/
No exemplo de código anterior, o exemplo final apresenta uma incompatibilidade entre o formato ymd e a cadeia de entrada. O terceiro nó da cadeia de entrada representa um valor numérico demasiado grande para ser um dia. A Microsoft não garante o valor de saída dessas descorrespondências.
O CONVERT oferece códigos explícitos para controlo determinístico de formatos de data
O nosso artigo de documentação CAST e CONVERT lista códigos explícitos que pode ser usado com a função CONVERT para controlar deterministicamente as conversões de datas. Todos os meses, o artigo tem um dos nossos maiores números de visualizações.
- CAST e CONVERT (Transact-SQL): Estilos de data e hora
- CAST e CONVERT (Transact-SQL): Certas conversões de data-hora são não determinísticas
Nível de compatibilidade 90 e acima
No SQL Server 2000, o nível de compatibilidade era 80. Para definições de nível 80 ou inferiores, as conversões implícitas de data foram determinísticas.
A partir do SQL Server 2005 e do seu nível de compatibilidade de 90, as conversões implícitas de datas tornaram-se não determinísticas. As conversões de datas tornaram-se dependentes e SETSET LANGUAGESETSET DATEFORMAT a partir do nível 90.
Unicode
A conversão de dados de caracteres não-Unicode entre colações também é considerada não determinística.