sql-server - tamanho - varchar(max) sql server




Conversão de cadeia de caracteres do Sql Server para data (7)

Eu quero converter uma string como esta:

'10/15/2008 10:06:32 PM'

no valor DATETIME equivalente no Sql Server.

Na Oracle, eu diria isso:

TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM')

Esta questão implica que devo analisar a cadeia em um dos formatos padrão e, em seguida, converter usando um desses códigos. Isso parece ridículo para uma operação tão mundana. Existe um caminho mais fácil?


Esta page tem algumas referências para todas as conversões de data e hora especificadas disponíveis para a função CONVERT. Se seus valores não se enquadram em um dos padrões aceitáveis, então acho que a melhor coisa é seguir a rota ParseExact.


Execute isso através do seu processador de consultas. Ele formata datas e / ou horas, e um deles deve fornecer o que você está procurando. Não vai ser difícil de adaptar:

Declare @d datetime
select @d = getdate()

select @d as OriginalDate,
convert(varchar,@d,100) as ConvertedDate,
100 as FormatValue,
'mon dd yyyy hh:miAM (or PM)' as OutputFormat
union all
select @d,convert(varchar,@d,101),101,'mm/dd/yy'
union all
select @d,convert(varchar,@d,102),102,'yy.mm.dd'
union all
select @d,convert(varchar,@d,103),103,'dd/mm/yy'
union all
select @d,convert(varchar,@d,104),104,'dd.mm.yy'
union all
select @d,convert(varchar,@d,105),105,'dd-mm-yy'
union all
select @d,convert(varchar,@d,106),106,'dd mon yy'
union all
select @d,convert(varchar,@d,107),107,'Mon dd, yy'
union all
select @d,convert(varchar,@d,108),108,'hh:mm:ss'
union all
select @d,convert(varchar,@d,109),109,'mon dd yyyy hh:mi:ss:mmmAM (or PM)'
union all
select @d,convert(varchar,@d,110),110,'mm-dd-yy'
union all
select @d,convert(varchar,@d,111),111,'yy/mm/dd'
union all
select @d,convert(varchar,@d,12),12,'yymmdd'
union all
select @d,convert(varchar,@d,112),112,'yyyymmdd'
union all
select @d,convert(varchar,@d,113),113,'dd mon yyyy hh:mm:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,114),114,'hh:mi:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,120),120,'yyyy-mm-dd hh:mi:ss(24h)'
union all
select @d,convert(varchar,@d,121),121,'yyyy-mm-dd hh:mi:ss.mmm(24h)'
union all
select @d,convert(varchar,@d,126),126,'yyyy-mm-dd Thh:mm:ss:mmm(no spaces)'

O SQL Server (2005, 2000, 7.0) não possui nenhuma maneira flexível, ou até mesmo não flexível, de obter um datetime estruturado arbitrariamente no formato de string e convertê-lo no tipo de dados datetime.

Por "arbitrariamente", quero dizer "uma forma que a pessoa que escreveu, embora talvez não você, eu ou alguém do outro lado do planeta, consideraria ser intuitivo e completamente óbvio". Francamente, não tenho certeza se existe algum algoritmo desse tipo.


Para esse problema, a melhor solução que uso é ter uma função CLR no Sql Server 2005 que usa uma das funções DateTime.Parse ou ParseExact para retornar o valor DateTime com um formato especificado.


Se você quiser que o SQL Server tente descobrir, apenas use CAST CAST ('whatever' AS datetime). No entanto, essa é uma má idéia em geral. Há problemas com datas internacionais que surgem. Então, como você descobriu, para evitar esses problemas, você deseja usar o formato canônico ODBC da data. Esse é o formato número 120, 20 é o formato para apenas dois dígitos. Eu não acho que o SQL Server tem uma função interna que permite que você forneça um formato dado pelo usuário. Você pode escrever o seu próprio e pode até encontrar um, se você pesquisar online.







string-to-datetime