Estou tentando converter uma data com partes individuais, como 12, 1, 2007, em um datetime no SQL Server 2005. Tentei o seguinte:
CAST(DATEPART(year, DATE)+'-'+ DATEPART(month, DATE) +'-'+ DATEPART(day, DATE) AS DATETIME)
mas isso resulta na data errada. Qual é a maneira correta de transformar os três valores de data em um formato de data e hora adequado.
sql
sql-server
sql-server-2005
tsql
Brandon
fonte
fonte
Respostas:
Supondo que
y, m, d
sejam todosint
, que tal:Por favor, veja minha outra resposta para o SQL Server 2012 e acima
fonte
yyyymmdd
formato funciona independentemente dessas configurações. "Uma cadeia de seis ou oito dígitos é sempre interpretada como ymd ." docs.microsoft.com/en-us/sql/t-sql/data-types/… Consulte esta resposta: stackoverflow.com/a/46064419/2266979Tente o seguinte:
Funciona também, tem o benefício adicional de não fazer nenhuma conversão de string, por isso é um processamento aritmético puro (muito rápido) e não depende de nenhum formato de data. valor da parte cuja primeira parte é um número inteiro que representa o número de dias desde 1 de janeiro de 1900 e a segunda parte é uma fração decimal que representa a parte fracionária de um dia (para a hora) --- Portanto, o valor inteiro 0 (zero ) sempre se traduz diretamente na manhã da meia-noite de 1 de janeiro de 1900 ...
ou, graças à sugestão do @brinary,
Editado em outubro de 2014. Conforme observado pelo @cade Roux, o SQL 2012 agora tem uma função interna:
DATEFROMPARTS(year, month, day)
isso faz a mesma coisa.
Editado em 3 de outubro de 2016, (Obrigado a @bambams por perceber isso e @brinary por corrigi-lo), A última solução, proposta por @brinary. parece não funcionar por anos bissextos, a menos que a adição de anos seja realizada primeiro
fonte
@Year = 2001
, por exemplo ,@Month = 13
e@DayOfMonth = 32
resulta em2002-02-01T00:00:00.000
. A resposta aceita (por Cade Roux) gera um erro, o que é mais útil.O SQL Server 2012 possui uma nova e maravilhosa função DATEFROMPARTS (que gerará um erro se a data for inválida - minha principal objeção a uma solução baseada em DATEADD para esse problema):
http://msdn.microsoft.com/en-us/library/hh213228.aspx
ou
fonte
Ou usando apenas uma única função dateadd:
fonte
O Sql Server 2012 possui uma função que criará a data com base nas partes ( DATEFROMPARTS ). Para o resto de nós, aqui está uma função db que criei que determinará a data das partes (obrigado @Charles) ...
Você pode chamar assim ...
Retorna ...
fonte
Tente CONVERT em vez de CAST.
CONVERT permite um terceiro parâmetro indicando o formato da data.
A lista de formatos está aqui: http://msdn.microsoft.com/en-us/library/ms187928.aspx
Atualizar após outra resposta ter sido selecionada como a resposta "correta":
Realmente não entendo por que uma resposta é selecionada que depende claramente das configurações de NLS do seu servidor, sem indicar essa restrição.
fonte
Você também pode usar
Funciona no SQL desde a versão 2012 e AzureSQL
fonte
É mais seguro e organizado usar um ponto de partida explícito '19000101'
fonte
declare @output datetime2 = 0
e em vez de@Year - 1900
usar@Year - DATEPART(year,0);
? Isso funciona sem nenhuma conversão no SQL Server 2008 e muito mais claro.Se você não deseja manter as strings fora dele, isso também funciona (coloque-o em uma função):
fonte
Eu adiciono uma solução de uma linha se você precisar de um datetime de partes de data e hora :
fonte
Experimentar
fonte
Para versões do SQL Server abaixo de 12, recomendo o uso
CAST
em combinação comSET DATEFORMAT
como você cria essas strings é com você
fonte
Tente esta consulta:
Resultado:
fonte
Eu sei que o OP está pedindo a resposta do SQL 2005, mas a pergunta é bastante antiga; portanto, se você estiver executando o SQL 2012 ou superior, poderá usar o seguinte:
Referência: https://docs.microsoft.com/en-us/sql/t-sql/functions/eomonth-transact-sql?view=sql-server-2017&viewFallbackFrom=sql-server-previousversions
fonte
Pessoalmente, prefiro o Substring, pois fornece opções de limpeza e capacidade de dividir o texto conforme necessário. A suposição é que os dados tenham o formato 'dd, mm, aaaa'.
Aqui está uma demonstração de como ele pode ser processado se os dados forem armazenados em uma coluna. Escusado será dizer que é ideal verificar o conjunto de resultados antes de aplicar na coluna
fonte