Como analisar string em data?

85

Como posso converter uma string em uma data no T-SQL?

Meu caso de teste é a string: '24.04.2012'

Nazar Tereshkovych
fonte

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:

MAbraham1
fonte
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.

Eric
fonte
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
4

Você pode usar:

SELECT CONVERT(datetime, '24.04.2012', 103) AS Date

Referência: CAST e CONVERT (Transact-SQL)

Seann Alexander
fonte
É interessante que funcione. O formato 103 é dd / mm / aaaa e 104 é dd.mm.aaaa.
Jeff Moden
1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

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

2012-04-24 00:00:00.000
JMMS Karunarathne
fonte
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