Eu quero converter uma string como esta:
'10/15/2008 10:06:32 PM'
no valor DATETIME equivalente no Sql Server.
No Oracle, eu diria o seguinte:
TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM')
Esta pergunta implica que eu devo analisar a string em um dos formatos padrão e depois converter usando um desses códigos. Isso parece ridículo para uma operação tão mundana. Existe uma maneira mais fácil?
sql-server
tsql
datetime
sql-server-2005
string-to-datetime
JosephStyons
fonte
fonte
Respostas:
O SQL Server (2005, 2000, 7.0) não possui nenhuma maneira flexível, ou mesmo não flexível, de obter um horário datado arbitrariamente estruturado no formato de string e convertê-lo no tipo de dados datetime.
Por "arbitrariamente", quero dizer "uma forma que a pessoa que a escreveu, embora talvez você, eu ou alguém do outro lado do planeta, considere intuitiva e completamente óbvia". Francamente, não tenho certeza se existe algum algoritmo desse tipo.
fonte
9/6/12
significava 6 de setembro de 2012, 9 de junho de 2012, 6 de dezembro de 2009 ou outra coisa?Tente isto
e
Consulte CAST e CONVERT (Transact-SQL) para obter mais detalhes.
fonte
Cast('2011-07-07' as datetime)
também funciona e elimina a ambiguidade em relação ao pedido mensal e diário.SET DATEFORMAT dmy
antes da sua consulta #Execute isso no seu processador de consultas. Ele formata datas e / ou horários como esse e um deles deve fornecer o que você está procurando. Não será difícil se adaptar:
fonte
No SQL Server Denali, você poderá fazer algo que se aproxima do que está procurando. Mas você ainda não pode simplesmente passar nenhuma sequência de datas maluca definida arbitrariamente e esperar que o SQL Server se adapte. Aqui está um exemplo usando algo que você postou em sua própria resposta. A função FORMAT () e também pode aceitar localidades como argumento opcional - é baseada no formato .Net, portanto, a maioria, se não todos, os formatos de token que você espera ver estarão lá.
É altamente recomendável que você assuma mais controle e desinfete suas entradas de data. Os dias em que as pessoas digitam datas usando o formato que desejam em um campo de formulário de texto livre devem estar muito atrasados agora. Se alguém entrar em 9/8/2011 é 9 de agosto ou 8 de setembro? Se você escolher uma data em um controle de calendário, o aplicativo poderá controlar o formato. Não importa o quanto você tente prever o comportamento de seus usuários, eles sempre descobrirão uma maneira mais burra de inserir uma data para a qual você não planejou.
Até Denali, no entanto, acho que o @Ovidiu tem os melhores conselhos até agora ... isso pode ser feito de maneira bastante trivial, implementando sua própria função CLR. Em seguida, você pode escrever um caso / alternar para os formatos malucos não-padrão que desejar.
ATUALIZAÇÃO para @dhergert :
Resultados:
Você ainda precisa ter essa outra informação crucial primeiro. Você não pode usar o T-SQL nativo para determinar se
6/9/2012
é 9 de junho ou 6 de setembro.fonte
Para esse problema, a melhor solução que eu uso é ter uma função CLR no Sql Server 2005 que use uma das funções DateTime.Parse ou ParseExact para retornar o valor DateTime com um formato especificado.
fonte
Usa isto:
E consulte a tabela na documentação oficial para os códigos de conversão.
fonte
por que nao tentar
formatos de data podem ser encontrados em Auxiliar do SQL Server> Formatos de data do SQL Server
fonte
select convert(date,'10/15/2011 00:00:00',101)
. Mais detalhes sobre o formato e por 101, no docs.microsoft.com/en-us/sql/t-sql/functions/...Levei um minuto para descobrir isso, então aqui está, caso isso possa ajudar alguém:
No SQL Server 2012 e melhor, você pode usar esta função:
Aqui está como eu acabei extraindo as partes da data para colocar nessa função:
fonte
Esta página possui 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, acho que a melhor coisa é seguir a rota ParseExact.
fonte
Pessoalmente, se você estiver lidando com formatos arbitrários ou totalmente fora do comum, desde que você saiba o que eles estão adiantados ou serão, basta usar o regexp para extrair as seções da data desejada e formar um componente válido de data / hora.
fonte
Sei que este é um post antigo e com muitas respostas, mas muitas pessoas pensam que precisam separar as coisas e juntá-las novamente ou insistem que não há como fazer implicitamente a conversão solicitada pelo original do OP .
Para revisar e, esperançosamente, fornecer uma resposta fácil para outras pessoas com a mesma pergunta, o OP perguntou como converter '15/10/2008 22:06:32' em DATETIME. Agora, o SQL Server possui algumas dependências de idioma para conversões temporais, mas se o idioma for inglês ou algo semelhante, isso se tornará um problema simples ... basta fazer a conversão e não se preocupar com o formato. Por exemplo (e você pode usar CONVERT ou CAST) ...
... e que produz as respostas a seguir, ambas corretas.
Como se costuma dizer nos comerciais de TV: "Mas espere! Não faça o pedido ainda! Sem nenhum custo extra, pode fazer MUITO mais!"
Vamos ver o verdadeiro poder das conversões temporais com o DATETIME e examinar parcialmente o erro conhecido como DATETIME2. Confira os formatos malucos que o DATETIME pode manipular automaticamente e o DATETIME2 não. Execute o código a seguir e veja ...
Então, sim ... O SQL Server realmente tem um método bastante flexível de lidar com todos os tipos de formatos temporais esquisitos e nenhum tratamento especial é necessário. Nem precisamos remover os "PM" adicionados às 24 horas. É "PFM" (Pure Freakin 'Magic).
As coisas variam um pouco, dependendo do IDIOMA que você selecionou para o servidor, mas muito dele será tratado de qualquer maneira.
E essas conversões "auto-mágicas" não são algo novo. Eles percorrem um longo caminho de volta.
fonte
Se você deseja que o SQL Server tente descobrir, basta usar CAST CAST ('qualquer que seja' AS data / hora). No entanto, essa é uma má ideia em geral. Existem problemas com datas internacionais que surgiriam. Portanto, 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 do ano. Não acho que o SQL Server tenha uma função interna que permita fornecer um formato determinado ao usuário. Você pode escrever o seu próprio e pode até encontrar um se pesquisar online.
fonte
converter string para datetime no MSSQL implicitamente
fonte
fonte