Có nhiều định dạng được SQL Server hỗ trợ - xem Sách trực tuyến MSDN trên CAST và CONVERT . Hầu hết các định dạng này phụ thuộc vào cài đặt bạn có - do đó, các cài đặt này có thể hoạt động một số lần - 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 - bất kể cài đặt ngôn ngữ và định dạng máy chủ SQL của bạn.
Các định dạng ISO-8601 được hỗ trợ bởi SQL Server có hai hương vị:
YYYYMMDD
chỉ ngày (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 phụ thuộc vào các thiết lập DateFormat trong SQL Server của bạn và sẽ không làm việc trong mọi tình huống!
hoặc là:
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à cố định T
là dấu phân cách giữa phần ngày và giờ của bạn DATETIME
.
Đ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 - 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 định dạng 24 giờ quốc tế thay vì định dạng AM / PM 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ì đơn giản DATETIME
) và hiện tại của bạn INSERT
sẽ chỉ hoạt động mà không gặp vấn đề gì! :-) DATETIME2
tốt hơn rất nhiều và ít kén chọn hơn đối với các chuyển đổi - và đó là loại 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 quá phức tạp và hơi khó hiểu - đó chỉ là cách nó diễn ra. Nhưng với YYYYMMDD
định dạng, bạn sẽ ổn đối với mọi phiên bản SQL Server và cho mọi cài đặt ngôn ngữ và định dạng ngày tháng trong SQL Server của bạn.