2012-07-25 13 views
5

Mam następujący interfejs Procedura:Błąd typu konwersji danych nvarchar do datetime

Create procedure [dbo].[InsertItemDetails] 
    @TimeItemAdded datetime 

Kiedy ja nazywam to w ten sposób:

EXEC [dbo].[InsertItemDetails] 
    @TimeItemAdded = N'20/07/2012 00:00:00'; 

otrzymuję ten błąd:

Msg 8114, Level 16, State 5
Error converting data type nvarchar to datetime.

+0

Jaką wartość jesteś przechodząc do '' @TimeItemAdded parametru 'InsertItemDetails'? – LittleBobbyTables

+0

20/07/2012 00:00:00 jako data i czas –

Odpowiedz

10

W zależności od ustawień regionalnych, parametr, który przekazujesz do urządzenia @TimeItemAdded może nie zostać rozpoznany.

Należy zdać datę jako:

20120720 
+0

okrzyki, problem rozwiązany, przyjmę go w 9 minut –

+2

To nie jest bezpieczny format. 'USTAW LANGUAGE FRENCH; SELECT CONVERT (DATETIME, '2012-07-20 00:00:00'); 'daje' Msg 242, Poziom 16, Stan 3, Linia 2; La conversion d'un type de données varchar en typ de données datetime a créé une valeur hors limites. "Bezpieczne formaty dla datetime to" RRRRMMDD "lub" RRRR-MM-DDTHH: MM: SS.nnn' - to "T" jest ważne. –

+0

@AaronBertrand - fascynujący; usunięto czas na konsystencję. – LittleBobbyTables

2

Użyj jednoznaczny ciąg dosłownego do tej pory. W takim przypadku:

EXEC dbo.InsertItemDetails 
    ... 
    , @TimeItemAdded = '20120720'; 

Co więcej, pamiętaj o podaniu mocno napisanego parametru, jeśli wiesz, że data jest prawidłowa. Najlepiej, aby nigdy nie było prezentowane jako ciąg znaków w dowolnym formacie.

formaty regionalne, takie jak M/D/Y są złe wieści, ponieważ nie można zagwarantować, że będą pracować danej sesji użytkownika, dateformat, ustawienia języka, ustawień regionalnych na maszynie itp

0

ten link ma wszystkie formaty datetime, ich konwertery http://www.sql-server-helper.com/tips/date-formats.aspx

Możesz przekazać go jako varchar i jawnie przekonwertować go na datetime przy użyciu odpowiedniego kodu formatu daty. Na przykład:

SELECT CONVERT(DATETIME, '20/07/2012 00:00:00', 103) 

103 jest kodem datetime, którego szukasz.

+1

Nie zgadzam się, że powinieneś zmienić parametr na varchar. Napraw format (lub użyj właściwego typu danych) tak wcześnie, jak to możliwe. Jeśli zmienisz parametr na varchar, ludzie mogą przekazywać wszystko, co chcą. Na przykład: mm/dd/rrrr'; '06/07/2012' po prostu zapisze błędną datę w trybie cichym, a' 07/20/2012' wygeneruje wyjątek. –

0

SQL odczytać datę jako 7/20/2012 który jest nieprawidłowy, może przekazać swoją datę przedmiotów z bezpieczniejsze Format yyyy-MM-dd np 2012-07-20

Powiązane problemy