Това може да зависи от различни фактори - регионалните настройки на операционната система, езика на текущия потребител и настройките за формата на датата. По подразбиране Windows използва US English
, а настройките на потребителя са US English
и MDY
.
Но ето няколко примера, които показват как това може да се промени.
Потребителят използва настройките на БРИТАНСКИЯ език:
-- works:
SET LANGUAGE BRITISH;
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');
-- fails:
SELECT CONVERT(DATETIME, '04/13/2012');
GO
(Грешка)
Потребителят използва Français:
-- works:
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');
-- fails:
SELECT CONVERT(DATETIME, '04/13/2012');
GO
(Грешка)
Потребителят отново използва 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
(Грешка)
Потребителят използва DMY вместо 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
(Грешка)
Най-добрият ви залог винаги е да използвате стандартни ISO, нерегионални, безопасни, недвусмислени формати за дата. Двете, които обикновено препоръчвам са:
YYYYMMDD - for date only.
YYYY-MM-DDTHH:MM:SS[.mmm] - for date + time, and yes that T is important.
Нито едно от тях не е неуспешно:
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');
Затова силно препоръчвам вместо да позволявате на потребителите да въвеждат свободни текстови формати за дата (или сами да използвате ненадеждни формати), да контролирате въведените си низове и да се уверите, че се придържат към един от тези безопасни формати. Тогава няма да има значение какви настройки има потребителят или какви са основните регионални настройки, вашите дати винаги ще се тълкуват като датите, за които са били предназначени. Ако понастоящем позволявате на потребителите да въвеждат дати в текстово поле във формуляр, спрете да правите това и внедрете календарна контрола или поне списък за избор, за да можете в крайна сметка да контролирате формата на низа, който се предава обратно на SQL Server.
За малко информация, моля, прочетете "Най-доброто ръководство за датата и часа" на Тибор Карази типове данни" и моята публикация "Лошо Навици за ритане:Неправилна обработка на заявки за дата/обхват."