Como analisar string em data?


Respostas:




22

Supondo que o banco de dados seja MS SQL Server 2012 ou superior, aqui está uma solução que funciona. A instrução básica contém o try-parse in-line:

SELECT TRY_PARSE('02/04/2016 10:52:00' AS datetime USING 'en-US') AS Result;

Aqui está o que implementamos na versão de produção:

UPDATE dbo.StagingInputReview
 SET ReviewedOn = 
     ISNULL(TRY_PARSE(RTrim(LTrim(ReviewedOnText)) AS datetime USING 'en-US'), getdate()),
 ModifiedOn = (getdate()), ModifiedBy = (suser_sname())
 -- Check for empty/null/'NULL' text
 WHERE not ReviewedOnText is null 
   AND RTrim(LTrim(ReviewedOnText))<>''
   AND Replace(RTrim(LTrim(ReviewedOnText)),'''','') <> 'NULL';

As colunas ModifiedOn e ModifiedBy são apenas para fins de rastreamento de banco de dados interno.

Consulte também essas referências do Microsoft MSDN:


Isso pressupõe que o OP está usando o Sql Server 2012+
Mark Kram

8

Embora a coisa CONVERT funcione, você realmente não deve usá-la. Você deve se perguntar por que está analisando valores de string no SQL-Server. Se este é um trabalho único em que você está corrigindo manualmente alguns dados, você não obterá esses dados outra vez, não há problema, mas se algum aplicativo estiver usando isso, você deve alterar algo. A melhor maneira seria usar o tipo de dados "data". Se for uma entrada do usuário, isso é ainda pior. Em seguida, você deve primeiro fazer alguma verificação no cliente. Se você realmente deseja passar valores de string onde o SQL-Server espera uma data, você sempre pode usar o formato ISO ('AAAAMMDD') e ele deve converter automaticamente.


5
Que tal uma situação em que você está importando arquivos de dados de algum sistema externo e a coluna de entrada está em um desses formatos, por exemplo, "31/05/2013", mas que vem como uma string? E você está escrevendo, digamos, um procedimento armazenado para importar esses dados ou usando o SSIS para importá-los? Então CONVERT seria a coisa apropriada para usar, não é?
David Barrows

Não necessariamente, nas situações em que o MS SQL Server hospeda modelos de dados analíticos, em oposição aos de transação, é perfeitamente normal usar CONVERT porque ele tem que lidar com muitas fontes externas que não seriam facilmente recebidas como um tipo de data (como David Barrows aludiu acima).
Será

O formato de literal de string padrão para datas é AAAA-MM-DD
YB de


1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

fará o que for necessário, o resultado:

2012-04-24 00:00:00.000

Isso não parece funcionar para o que o OP postou, mesmo para configurações de idioma diferentes. Tente. Se realmente funcionar para você, poste qual é a sua configuração de idioma atual. Obrigado. Aqui está o código para tentar ... SELECT CONVERT (DateTime, '24 .04.2012 ', 121) AS ExpireDate
Jeff Moden
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.