2009-07-27 3 views
10

В моей тестовой БД даты отображаются в формате DD/MM/YYYY. При отображении я имею в виду, что при щелчке правой кнопкой мыши, открываем таблицу в Management Studio, возвращаемые данные отображаются в формате DD/MM/YYYY.Вопросы SQL Server Datetime. Американский против Великобритании?

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

ответ

11

Вы можете использовать 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 
+0

Это замечательно, но я ищу постоянное решение, а не решение для сеансов. – super9

+0

Сладкий. FYI правильное имя таблицы - sys.syslanguages. Кроме того, я просто узнал, что вы можете изменить язык по умолчанию на уровне пользователя, перейдя в раздел «Безопасность -> Пользовательский вход -> Свойства -> Язык». Спасибо за это Mehrdad – super9

+0

Nai: syslanguages ​​самостоятельно будет работать, если вы находитесь в основной базе данных. Добавление 'sys.' в эту строку привело к тому, что полосы прокрутки появлялись, поэтому я сократил ее;) –

4

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

[Edit: Я просто говорю о том, что я положил в моем сценарии SQL для обеспечения совместимости независимо от настроек сервера, не то, что «отображает» SQL Server]

+0

Как можно поменять значение Datime по умолчанию для T-SQL по умолчанию? – super9

+0

Извините, должен был быть более конкретным - ответьте на обновления. –

1

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

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

+0

Даты хранятся в формате DATETIME. Извините, если я не понял. – super9

+0

Я предполагал, что; моя точка зрения заключается в том, что не важно, как сервер хочет обрабатывать их как текст, если вы просто никогда (в своей системе) не рассматриваете их как текст. –

+0

О, я понимаю, что ты имеешь в виду. Я обычно передаю их как переменные, но, тем не менее, хороший совет. Спасибо за это! – super9

2

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

dd MMM yyyy 

, например

"11 JUL 2009" 

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

1

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

3

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

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

Либо добавьте это в свой Интернет.конфигурационный файл:

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

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

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

Надеется, что это поможет.

Смежные вопросы