Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

W jaki sposób SQL Server decyduje o formacie niejawnej konwersji daty i godziny?

Może to zależeć od wielu czynników — ustawień regionalnych systemu operacyjnego, języka bieżącego użytkownika i ustawień formatu daty. Domyślnie system Windows używa języka US English , a ustawienia użytkownika to US English i MDY .

Ale oto kilka przykładów pokazujących, jak to może się zmienić.

Użytkownik używa ustawień języka BRYTYJSKIEGO:

-- works:
SET LANGUAGE BRITISH;
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');

-- fails:
SELECT CONVERT(DATETIME, '04/13/2012');
GO

(Błąd)

Użytkownik używa francuskiego:

-- works:
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');

-- fails:
SELECT CONVERT(DATETIME, '04/13/2012');
GO

(Błąd)

Użytkownik ponownie używa języka francuskiego:

SET LANGUAGE FRENCH;

-- fails (proving that, contrary to popular belief, YYYY-MM-DD is not always safe):
SELECT CONVERT(DATETIME, '2012-04-30');
GO

(Błąd)

Użytkownik używa DMY zamiast 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

(Błąd)

Zawsze najlepiej jest używać standardowych, nieregionalnych, bezpiecznych i jednoznacznych formatów dat zgodnych ze standardem ISO. Dwa, które zazwyczaj polecam to:

YYYYMMDD                  - for date only.
YYYY-MM-DDTHH:MM:SS[.mmm] - for date + time, and yes that T is important.

Żadne z tych nie zawodzi:

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');

Dlatego zdecydowanie zalecam, aby zamiast pozwalać użytkownikom na wpisywanie dowolnych formatów daty (lub samemu używać niepewnych formatów), kontrolować ciągi wejściowe i upewnić się, że są zgodne z jednym z tych bezpiecznych formatów. Wtedy nie będzie miało znaczenia, jakie ustawienia ma użytkownik ani jakie są podstawowe ustawienia regionalne, Twoje daty będą zawsze interpretowane jako daty, do których miały być. Jeśli obecnie pozwalasz użytkownikom na wprowadzanie dat w polu tekstowym formularza, przestań to robić i zaimplementuj kontrolkę kalendarza lub przynajmniej listę wyboru, aby ostatecznie kontrolować format ciągu, który jest przekazywany z powrotem do SQL Server.

Aby uzyskać więcej informacji, przeczytaj "Najlepszy przewodnik po datach i godzinach" Tibora Karasziego typy danych" i mój post "Zły Nawyki do wyrzucenia:niewłaściwa obsługa zapytań dotyczących dat/zakresów”.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jakie zasoby są dostępne dla dostrajania wydajności bazy danych?

  2. Skonfiguruj zadania SQL w SQL Server za pomocą T-SQL

  3. Jak dowiedzieć się, co blokuje moje stoły?

  4. Jak sprawdzić poziom zgodności bazy danych w SQL Server za pomocą T-SQL

  5. In-Memory OLTP:Co nowego w SQL Server 2016