2012-12-28 39 views
8

tôi luôn luôn sử dụng mã này để chuyển đổi trong datetime:SQL Server chuyển đổi vấn đề với datetime

DECLARE @a datetime 
SET @a= CONVERT(datetime,'2012-12-28 14:04:43') 
print @a 

Nhưng điều này không có tác dụng nữa! Tôi đã cố gắng thậm chí khởi động lại SQL Server, nhưng vấn đề vẫn là:

Conversion error

Các lỗi trong hình là ở Ý. Trong tiếng Anh nên là:

Việc chuyển đổi một kiểu char dữ liệu datetime dẫn đến một datetime giá trị đó là ra khỏi phạm vi của giá trị được phép.

+0

Gần đây bạn đã thay đổi ngôn ngữ mặc định của thông tin đăng nhập thành tiếng Ý chưa? Điều này ảnh hưởng đến 'DATEFORMAT' và cách phân tích ngày. Nếu bạn thực hiện 'SET LANGUAGE english' thì mã của bạn hoạt động tốt nhưng không thành công trong' SET LANGUAGE italian' –

Trả lời

15

Có nhiều định dạng được SQL Server hỗ trợ - xem MSDN Books Online on CAST and CONVERT. Hầu hết các định dạng này là phụ thuộc vào về cài đặt nào bạn có - do đó, các cài đặt này có thể hoạt động đôi khi - và đôi khi không.

Cách giải quyết này là sử dụng (hơi thích nghi) tiêu chuẩn ISO-8601 định dạng ngày được hỗ trợ bởi SQL Server - định dạng này hoạt động luôn - bất kể cài đặt ngôn ngữ và DateFormat SQL Server của bạn.

Các ISO-8601 format được hỗ trợ bởi SQL Server có hai hương vị:

  • YYYYMMDD chỉ ngày (không phần thời gian); lưu ý ở đây: không có dấu gạch ngang!, điều đó rất quan trọng! YYYY-MM-DDKHÔNG độc lập với cài đặt dateformat trong Máy chủ SQL của bạn và sẽ KHÔNG hoạt động trong mọi tình huống!

hay:

  • YYYY-MM-DDTHH:MM:SS cho những ngày tháng và thời gian - lưu ý ở đây: định dạng này dấu gạch ngang (nhưng họ thể được bỏ qua), và cố định T như dấu phân cách giữa ngày và thời gian một phần của số DATETIME của bạn.

Điều này hợp lệ cho SQL Server 2000 trở lên.

Nếu bạn sử dụng SQL Server 2008 hoặc mới hơn và DATE datatype (chỉ DATE - khôngDATETIME!), sau đó bạn thực sự có thể cũng sử dụng định dạng YYYY-MM-DD và điều đó cũng sẽ hoạt động với bất kỳ cài đặt nào trong Máy chủ SQL của bạn.

Đừng hỏi tôi tại sao toàn bộ chủ đề này quá phức tạp và hơi khó hiểu - đó chỉ là cách thực hiện. Nhưng với định dạng YYYYMMDD, bạn nên sử dụng bất kỳ phiên bản SQL Server nào và cho bất kỳ cài đặt ngôn ngữ và định dạng ngày nào trong SQL Server của bạn.

Vì vậy, trong trường hợp cụ thể của bạn - sử dụng này:

DECLARE @a datetime 
SET @a= CONVERT(datetime, '2012-12-28T14:04:43') 
print @a 

và điều này sẽ làm việc trên bất kỳ SQL Server cài đặt, với bất kỳ cài đặt ngôn ngữ và định dạng ngày.

Nếu bạn chạy mã ban đầu của bạn cho tiếng Anh Mỹ - nó sẽ chỉ làm việc tốt:

SET LANGUAGE English 

DECLARE @a datetime 
SET @a= CONVERT(datetime, '2012-12-28 14:04:43') 
print @a 

Dec 28 2012 2:04PM 

nhưng nếu bạn sử dụng Ý (hoặc Đức, hoặc Anh, hoặc tiếng Pháp) như ngôn ngữ của bạn, nó sẽ thất bại định dạng mà không các T ở giữa chuỗi ngày/giờ là kHÔNG ngôn ngữ độc lập và không phải là "an toàn":

SET LANGUAGE Italian 

DECLARE @a datetime 
SET @a= CONVERT(datetime, '2012-12-28 14:04:43') 
print @a 

Msg 242, cấp 16, tiểu bang 3, dòng 4
La chuyển đổi không tìm thấy thông tin chi tiết trong khoảng thời gian ha không phải là valore không compreso nell'intervallo dei valori approvaliti.

4

Bạn đang cố chuyển đổi chuỗi thành ngày giờ. Vấn đề là với phần ngày tháng. Cách tốt nhất là để có được chuỗi ngày thành ISO format (yyyymmdd) và sau đó chuyển đổi. Thử cái này;

DECLARE @a datetime 
SET @a= CONVERT(datetime,replace('2012-12-28 14:04:43', '-','')) 
print @a 
+0

Cảm ơn bạn! những công việc này. Nhưng tôi không biết tại sao mã của tôi hoạt động trên máy tính của bạn tôi. – GVillani82

+0

Có thể là cài đặt văn hóa địa phương của anh ấy. – Kaf

0

Tôi đoán là định dạng ngày mặc định đã thay đổi trên máy tính của bạn. Thêm đặc điểm chuyển đổi trở lại sau:

SET @a= CONVERT(datetime,'2012-12-28 14:04:43', 121) 
Các vấn đề liên quan