Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как SQL Server решава формата за имплицитно преобразуване на дата и час?

Това може да зависи от различни фактори - регионалните настройки на операционната система, езика на текущия потребител и настройките за формата на датата. По подразбиране 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.

За малко информация, моля, прочетете "Най-доброто ръководство за датата и часа" на Тибор Карази типове данни" и моята публикация "Лошо Навици за ритане:Неправилна обработка на заявки за дата/обхват."



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да направя заявка за стойност в XML колоната на SQL Server

  2. Инсталиране на SQL Server 2017

  3. Свързване на приложения, работещи на Linux, към Amazon Relational Database Services (RDS) за SQL Server

  4. Откъснете (не закръглете) десетичните знаци в SQL Server

  5. SQL Server:Течове на ниво на изолация в обединените връзки