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-DD
là KHÔ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 có 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 vì đị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.
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' –