Điều này có thể phụ thuộc vào nhiều yếu tố - cài đặt khu vực của hệ điều hành, cài đặt ngôn ngữ và định dạng ngày của người dùng hiện tại. Theo mặc định, Windows sử dụng US English
và cài đặt của người dùng là US English
và MDY
.
Nhưng đây là một số ví dụ để cho thấy điều này có thể thay đổi như thế nào.
Người dùng đang sử dụng cài đặt ngôn ngữ BRITISH:
-- works:
SET LANGUAGE BRITISH;
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');
-- fails:
SELECT CONVERT(DATETIME, '04/13/2012');
GO
(Lỗi)
Người dùng đang sử dụng Français:
-- works:
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');
-- fails:
SELECT CONVERT(DATETIME, '04/13/2012');
GO
(Lỗi)
Người dùng đang sử dụng lại Français:
SET LANGUAGE FRENCH;
-- fails (proving that, contrary to popular belief, YYYY-MM-DD is not always safe):
SELECT CONVERT(DATETIME, '2012-04-30');
GO
(Lỗi)
Người dùng đang sử dụng DMY thay vì MDY:
SET LANGUAGE ENGLISH;
SET DATEFORMAT DMY;
-- works:
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');
-- fails:
SELECT CONVERT(DATETIME, '04-30-2012');
GO
(Lỗi)
Đặt cược tốt nhất của bạn, luôn luôn, là sử dụng các định dạng ngày tiêu chuẩn ISO, không theo khu vực, an toàn, rõ ràng. Hai cách tôi thường khuyên dùng là:
YYYYMMDD - for date only.
YYYY-MM-DDTHH:MM:SS[.mmm] - for date + time, and yes that T is important.
Không ai trong số này không thành công:
SET DATEFORMAT MDY;
SET LANGUAGE ENGLISH;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
SET LANGUAGE BRITISH;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
SET DATEFORMAT DMY;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
Do đó, tôi thực sự khuyên rằng thay vì để người dùng nhập các định dạng ngày văn bản miễn phí (hoặc bạn tự sử dụng các định dạng không đáng tin cậy), hãy kiểm soát các chuỗi nhập của bạn và đảm bảo chúng tuân thủ một trong các định dạng an toàn này. Sau đó, người dùng có cài đặt nào hoặc cài đặt khu vực cơ bản là gì sẽ không quan trọng, ngày của bạn sẽ luôn được hiểu là ngày họ dự định. Nếu bạn hiện đang cho phép người dùng nhập ngày vào trường văn bản trên biểu mẫu, hãy ngừng làm việc đó và triển khai điều khiển lịch hoặc ít nhất là danh sách chọn để cuối cùng bạn có thể kiểm soát định dạng chuỗi được chuyển trở lại SQL Server.
Để biết một số thông tin cơ bản, vui lòng đọc "Hướng dẫn cơ bản về ngày giờ của Tibor Karaszi kiểu dữ liệu " và bài đăng của tôi "Xấu Thói quen cần bắt đầu:Xử lý sai các truy vấn về ngày / phạm vi. "