2013-07-09 3 views
5

Недавно мы перенесли нашу базу данных на другой сервер, и, поскольку это, похоже, изменение формата даты изменилось.Форматирование даты в SQL Server из строки

Ранее мы могли бы использовать следующий ..

SELECT * FROM table WHERE date > 'YYYY-MM-DD' 

Однако теперь мы должны использовать ..

SELECT * FROM table WHERE date > 'YYYY-DD-MM' 

Может кто-нибудь сказать мне, что мне нужно изменить, чтобы вернуться к предыдущей версии ?

+0

Ответ есть http://stackoverflow.com/questions/17491459/how-can-i- get-sql-server-to-use-user-locale-for-date-format-for-a-query –

ответ

2

Попробуйте это один -

Запрос:

SET DATEFORMAT ymd 

Читать настройки тока:

DBCC USEROPTIONS 

Выход:

Set Option     Value 
-------------------------- ----------------- 
... 
language     us_english 
dateformat     ymd 
... 
+0

Как я могу узнать, что такое текущий формат даты? – lisburnite

+2

Попытайтесь использовать 'DBCC USEROPTIONS' – Devart

+0

в порядке, в настоящее время он установлен в dmy, это означает, что я должен был бы запросить с использованием« DD-MM-YYYY » – lisburnite

0

Это вопрос языка/культуры

Set Language 'us_english' 
+0

Как я могу узнать, что такое текущий язык? – lisburnite

+0

@lisburnite для этой ситуации также попытайтесь использовать 'DBCC USEROPTIONS' – Devart

+2

select @@ language – Serge

2

Вы правы, формат даты отличается между серверами.

Многие люди попадают в ловушку, предполагая, что если вы укажете дату-литературу как 'YYYY-MM-DD', она будет интерпретироваться как таковая независимо от формата текущей даты. Это неверно. SQL Server видит 4 цифры в начале строки и правильно выводит, что они представляют год. Тем не менее, он затем использует текущий формат даты, чтобы указать, каков круглый месяц и день. Если вы находитесь в Великобритании, например, это ставит вас в неудобную ситуацию, потому что вам нужен формат даты DMY, чтобы интерпретировать литер даты, например 'DD-MM-YYYY', но формат даты MDY для интерпретации даты, такой как 'YYYY-MM-DD'.

У вас есть несколько вариантов:

  • SET DATEFORMAT YMD, и не позволяют пользователям вводить даты любой другой путь.
  • Используйте синтаксис синтаксиса даты ODBC {d'YYYY-MM-DD'}. Это будет правильно проанализировано независимо от формата текущей даты. CONVERT(DATE, 'YYYY-MM-DD', 120) имеет тот же эффект.
  • Удалить все литеральные значения из ваших запросов и использовать параметры. Это, безусловно, лучшая альтернатива, и я настоятельно рекомендую ее.
+0

Спасибо, это имеет смысл в отношении того, что вначале разбирается год, а затем порядок месяца и даты – lisburnite

+0

используют форматы даты ISO –

2

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

Существует 2 формата iso, которые всегда специфичны - сервер sql всегда будет анализировать их одинаково независимо от настройки формата даты сервера.

К ним относятся:

1) Краткая форма: ГГГГММДД.Пример «20120301» - 1 марта 2012 года

2) Длинная форма: ГГГГ-ММ-ДДАТЬ: ММ: SS.msms '. Пример '2012-03-01T12: 13: 00.000Z' - 1 марта 2012 года в 13 минут 12 (PM)

В длинной форме miliseconds не является обязательным - это идеально подходит для даты и времени ISO '2012- 03-01T12: 13: 00Z '

Z в конце - информация о часовом поясе. SQL Server фактически не требует этого. (Хотя другие продукты являются немного более требовательным)

Попробуйте это, например:

DECLARE @foo DATETIME 

SET DATEFORMAT DMY 

-- this will be the 3rd of january in DMY 
SET @foo = '2012-03-01' 
SELECT 'DMY: Not ISO', @foo 

SET @foo = '20120301' 
SELECT 'DMY: ISO', @foo 

SET DATEFORMAT MDY 

-- this will be the 1st of March in MDY 
SET @foo = '2012-03-01' 
SELECT 'MDY: not ISO', @foo 

SET @foo = '20120301' 
SELECT 'MDY: ISO', @foo 

При использовании текста для ввода даты вы должны всегда пытаетесь использовать один из двух стандартов ISO. Это просто делает вещи намного более детерминированными.

Краткий формат (SQL Server) http://msdn.microsoft.com/en-US/library/ms187085(v=sql.90).aspx

ISO 8601 Формат (SQL Server) http://msdn.microsoft.com/en-us/library/ms190977(v=sql.90).aspx

+0

+1 - за хороший ответ. – Devart

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