ddmmyyyy
não é um formato de data válido. Você precisa primeiro transformar essa string em algo que possa ser analisado como um DATE
/ DATETIME
. A maneira mais rápida pode ser simplesmente SUBSTRING
as peças em um mm/dd/yyyy
formato. Isso converte com sucesso. Mas você tem um VARCHAR(8)
. Então você precisa aumentar isso para VARCHAR(10)
(ou melhor ainda, apenas CHAR(10)
), ou declare uma variável local para manter o valor alterado. Por exemplo:
DECLARE @Date VARCHAR(8); -- input parameter
SET @Date = '25032014';
DECLARE @Date2 CHAR(10);
SET @Date2 = SUBSTRING(@Date, 3, 2)
+ '/' + SUBSTRING(@Date, 1, 2)
+ '/' + SUBSTRING(@Date, 5, 4);
SELECT @Date2, CONVERT(DATE, @Date2);
-- 03/25/2014 2014-03-25
EDITAR: Na verdade, encontrei uma maneira um pouco mais simples. Comecei com esse método, mas percebi que não funcionava com
ddmmyyyy
ao contrário de mmddyyyy
. De alguma forma, não percebi que havia um número de estilo de data apropriado para mm/dd/yyyy
. Então, basta adicionar duas barras à string de entrada e chamar CONVERT
funciona, mas apenas se você usar 103
como o "estilo". E como a primeira solução, requer a alteração do parâmetro de entrada para VARCHAR(10)
ou CHAR(10)
em vez de VARCHAR(8)
, ou criando uma variável local para ser CHAR(10)
. DECLARE @Date VARCHAR(8); -- input parameter
SET @Date = '25032014';
DECLARE @Date2 CHAR(10);
SET @Date2 = STUFF(STUFF(@Date, 3, 0, '/'), 6, 0, '/');
SELECT @Date2, CONVERT(DATE, @Date2, 103); -- 103 = dd/mm/yyyy
-- 25/03/2014 2014-03-25
Os "estilos" de conversão podem ser encontrados na página do MSDN para CAST and CONVERT .