2012-07-25 15 views
5

Tôi đã giao diện thủ tục sau đây:Lỗi loại chuyển đổi dữ liệu nvarchar sang datetime

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

Khi tôi gọi nó theo cách này:

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

tôi nhận được lỗi này:

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

+0

giá trị gì bạn đang đi đến '@TimeItemAdded' tham số trong 'InsertItemDetails'? – LittleBobbyTables

+0

20/07/2012 00:00:00 theo ngày và giờ –

Trả lời

10

Tùy thuộc vào cài đặt khu vực của bạn, thông số bạn đang chuyển cho @TimeItemAdded có thể không được nhận dạng.

Bạn nên vượt qua ngày trong như:

20120720 
+0

cổ vũ, giải quyết vấn đề, tôi sẽ chấp nhận trong 9 phút –

+2

Đây không phải là định dạng an toàn. 'THIẾT LẬP NGÔN NGỮ; SELECT CONVERT (DATETIME, '2012-07-20 00:00:00'); 'lợi nhuận' Msg 242, Cấp 16, Tiểu bang 3, Dòng 2; La conversion d'un loại de données varchar en loại de données datetime một créé une valeur hors limites.' Định dạng an toàn cho datetime là 'YYYYMMDD' hoặc' YYYY-MM-DDTHH: MM: SS.nnn' - đó là 'T' là quan trọng. –

+0

@AaronBertrand - hấp dẫn; loại bỏ thời gian cho sự nhất quán – LittleBobbyTables

2

Sử dụng một chuỗi rõ ràng đen cho ngày của bạn. Trong trường hợp này:

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

Tốt hơn, hãy đảm bảo chuyển thông số được nhập mạnh vào nơi bạn biết ngày chính xác. Lý tưởng nhất, điều này sẽ không bao giờ được trình bày dưới dạng chuỗi ở bất kỳ định dạng nào.

định dạng khu vực như m/d/y là tin xấu, bởi vì bạn không thể đảm bảo rằng họ sẽ làm việc cho phiên làm việc của người dùng, DateFormat, cài đặt ngôn ngữ, các thiết lập khu vực trên máy tính, vv

0

này liên kết có tất cả các định dạng ngày giờ, conntries của chúng http://www.sql-server-helper.com/tips/date-formats.aspx

Bạn có thể chuyển nó thành một varchar và chuyển đổi nó thành ngày giờ bằng cách sử dụng mã định dạng ngày thích hợp. Ví dụ:

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

103 là mã ngày giờ bạn đang tìm kiếm.

+1

Tôi không đồng ý rằng bạn nên thay đổi tham số thành varchar. Sửa định dạng (hoặc sử dụng đúng kiểu dữ liệu) càng sớm càng tốt. Nếu bạn thay đổi các tham số để varchar, mọi người có thể vượt qua trong bất cứ điều gì họ muốn. 'mm/dd/yyyy' sẽ vỡ, ví dụ; '06/07/2012' sẽ chỉ lưu trữ sai ngày và' 07/20/2012' sẽ tạo ra một ngoại lệ. –

0

SQL đọc ngày của bạn như 7/20/2012 đó là không hợp lệ, bạn có thể vượt qua đối tượng ngày của bạn với định dạng an toàn hơn yyyy-MM-dd ví dụ: 2012-07-20