Có nhiều định dạng được SQL Server hỗ trợ - xem Sách MSDN Trực tuyến về CAST và CONVERT. Hầu hết các định dạng đó đều phụ thuộc về những cài đặt bạn có - do đó, những cài đặt này đôi khi có thể hoạt động - và đôi khi không.
Cách giải quyết vấn đề này là sử dụng định dạng ngày ISO-8601 (được điều chỉnh một chút) được SQL Server hỗ trợ - định dạng này luôn hoạt động luôn - bất kể cài đặt định dạng ngày và ngôn ngữ SQL Server của bạn.
Định dạng ISO-8601 được SQL Server hỗ trợ có hai loại:
-
YYYYMMDD
chỉ cho ngày tháng (không có 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 định dạng ngày trong SQL Server của bạn và sẽ KHÔNG hoạt động trong mọi tình huống!
hoặc:
-
YYYY-MM-DDTHH:MM:SS
cho ngày và giờ - lưu ý ở đây:định dạng này có dấu gạch ngang (nhưng chúng có thể được bỏ qua) và mộtT
cố định làm dấu phân cách giữa phần ngày và giờ trongDATETIME
của bạn .
Điều này hợp lệ cho SQL Server 2000 và mới hơn.
Vì vậy, trong trường hợp cụ thể của bạn - hãy sử dụng các chuỗi sau:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
và bạn sẽ ổn (lưu ý:bạn cần sử dụng quốc tế 24 giờ thay vì định dạng SA / CH 12 giờ cho việc này).
Ngoài ra :nếu bạn đang sử dụng SQL Server 2008 hoặc mới hơn, bạn cũng có thể sử dụng DATETIME2
kiểu dữ liệu (thay vì DATETIME
đơn giản ) và INSERT
hiện tại của bạn sẽ chỉ hoạt động mà không có bất kỳ vấn đề! :-) DATETIME2
tốt hơn rất nhiều và ít kén chọn chuyển đổi hơn - và dù sao thì đó cũng là kiểu dữ liệu ngày / giờ được đề xuất cho SQL Server 2008 hoặc mới hơn.
SELECT
CAST('02-21-2012 6:10:00 PM' AS DATETIME2), -- works just fine
CAST('01-01-2012 12:00:00 AM' AS DATETIME2) -- works just fine
Đừng hỏi tôi tại sao toàn bộ chủ đề này rất phức tạp và hơi khó hiểu - đó chỉ là cách của nó. Nhưng với YYYYMMDD
, bạn sẽ ổn đối với bất kỳ phiên bản SQL Server nào và đối với bất kỳ cài đặt ngôn ngữ và định dạng ngày tháng nào trong SQL Server của bạn.