SQL Server Datetime. Американский против Великобритании?

В моей тестовой БД даты отображаются в формате DD/MM/YYYY. Отображаемый я имею в виду, когда вы щелкните правой кнопкой мыши, откройте таблицу в Management Studio, возвращенные данные будут отображаться в формате DD/MM/YYYY.

Забавно, когда я пишу T-SQL для извлечения записей, мне нужно ввести формат MM/DD/YYYY, чтобы вернуть нужные данные. В любом случае, я могу привести это в формат DD/MM/YYYY?

Ответ 1

Вы можете использовать SET LANGUAGE, чтобы выбрать формат даты, который SQL Server ожидает в запросах (я думаю, что студия управления использует региональные настройки клиентского компьютера для отображения, но не уверен, хотя). Однако я предлагаю передавать значения с использованием параметров, а не встраивать их в запрос запроса. При использовании параметров вы не столкнетесь с какими-либо проблемами. Все заботится.

set language us_english
declare @d datetime = '1929/12/18'

set language british
declare @d datetime = '1929/12/18' -- fails

Чтобы изменить язык сервера по умолчанию:

declare @langid int = (select langid from syslanguages where name = 'british')
exec sp_configure 'default language', @langid
reconfigure with override

Ответ 2

Лично я всегда использую формат YYYY-MM-DD (или YYYYMMDD), поскольку он не является специфичным для культуры, и, ну, я думаю, он обращается ко мне, потому что он "логичен" (особенно, когда за ним следует время).

[Edit: я просто говорю о том, что я вставлял в свои SQL-скрипты, чтобы обеспечить совместимость независимо от настроек сервера, а не того, что SQL Server "отображает" ]

Ответ 3

Вы можете установить язык по умолчанию для каждого indvidual входа в SQL Server. Не могу вспомнить, но что-то вроде этого:

sp_defaultlanguage @loginame = 'LoginName', @language = 'Language'

Ответ 4

Если вы передадите DATETIME в формате

dd MMM yyyy

например

"11 JUL 2009"

никогда не бывает двусмысленности вокруг месяца и даты, и поэтому у вас никогда не должно быть проблем.

Ответ 5

Практически во всех случаях правильный способ решить эту проблему - просто не рассматривать дату как строку. Если вы передаете параметр или используете значение (типизированного) столбца, то преобразование текста сервера просто не является фактором. В дополнение к тому, чтобы избежать проблемы i18n, это также уменьшает вашу поверхность атаки. И это также экономит несколько циклов процессора; -p

Если вы используете EXEC для динамического SQL, тогда это также должно быть параметризировано с помощью sp_ExecuteSQL.

Ответ 6

Я пытаюсь использовать каноническую форму ODBC даты, где это возможно {d 'yyyy-mm-dd'} Таким образом, я знаю, как это будет интерпретировать сервер sql. Он отлично работает в TSQL.

Ответ 7

Либо добавьте это в свой файл web.config:

</system.web>
    <globalization culture="en-US" uiCulture="en-US" />
</system.web>

или вы можете добавить это выражение на страницу:

<%@ Page uiCulture="en-US" culture="en-US" %>

Надеюсь на эту помощь.