ddmmyyyy
nie jest prawidłowym formatem daty. Musisz najpierw przekształcić ten ciąg w coś, co można przetworzyć jako DATE
/ DATETIME
. Najszybszym sposobem może być po prostu SUBSTRING
kawałki w mm/dd/yyyy
format. To skutecznie konwertuje. Ale masz VARCHAR(8)
. Więc albo musisz zwiększyć to do VARCHAR(10)
(lub jeszcze lepiej, po prostu CHAR(10)
) lub zadeklaruj zmienną lokalną do przechowywania zmienionej wartości.
Na przykład:
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
EDYTUJ: Właściwie znalazłem nieco prostszy sposób. Zacząłem od tej metody, ale zdałem sobie sprawę, że nie działa z ddmmyyyy
w przeciwieństwie do mmddyyyy
. Jakoś przegapiłem, że był odpowiedni numer stylu daty dla dd/mm/yyyy
. Po prostu dodaj dwa ukośniki do przychodzącego ciągu, a następnie wywołaj CONVERT
działa, ale tylko jeśli używasz 103
jako „styl”. I podobnie jak pierwsze rozwiązanie, wymaga zmiany parametru przychodzącego na VARCHAR(10)
lub CHAR(10)
zamiast VARCHAR(8)
, lub utworzenie zmiennej lokalnej jako 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
„Style” konwersji można znaleźć na stronie MSDN dla CAST and CONVERT .