Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

converti varchar(ggmmaaaa) in formato data

ddmmyyyy non è un formato di data valido. Devi prima trasformare quella stringa in qualcosa che possa essere analizzato come DATE / DATETIME . Il modo più rapido potrebbe essere semplicemente SUBSTRING i pezzi in un mm/dd/yyyy formato. Che converte con successo. Ma hai un VARCHAR(8) . Quindi devi aumentare che sia VARCHAR(10) (o meglio ancora, solo CHAR(10) ), o dichiarare una variabile locale per contenere il valore alterato.

Ad esempio:

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

MODIFICA: In realtà, ho trovato un modo leggermente più semplice. Ho iniziato con questo metodo ma mi sono reso conto che non funzionava con ddmmyyyy al contrario di mmddyyyy . In qualche modo mi sono perso il fatto che esistesse un numero di stile di data appropriato per dd/mm/yyyy . Quindi, semplicemente aggiungendo due barre alla stringa in arrivo e quindi chiamando CONVERT funziona, ma solo se usi 103 come lo "stile". E come la prima soluzione, richiede la modifica del parametro in entrata in modo che sia VARCHAR(10) o CHAR(10) invece di VARCHAR(8) o creando una variabile locale che sia 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

Gli "stili" di conversione sono disponibili nella pagina MSDN per CAST e CONVERT .