Ошибка при сравнении даты в британском формате в предложении где - PullRequest
0 голосов
/ 01 ноября 2009

Когда я запускаю это в sql server2005, я получаю сообщение об ошибке.

select * from productratedates 
where RateDate BETWEEN '31/10/2009' AND '03/11/2009'

Ошибка: преобразование типа данных char в тип данных datetime привело к значению datetime вне диапазона.

Но когда я запускаю это на SQl server 2005. Это совершенно нормально.

select * from productratedates 
where RateDate BETWEEN '2009-10-31' AND '2009-11-03'

Я хочу сравнить дату в британском формате.

Любая помощь !!

Ответы [ 4 ]

2 голосов
/ 01 ноября 2009

Ваш комментарий говорит, что вы хотите ввести даты в формате день / месяц / год. Вы можете выбрать этот формат, используя SET DATEFORMAT :

SET DATEFORMAT dmy;

Например:

set dateformat dmy
select cast('31/10/2009' as datetime) -- succeeds
set dateformat mdy
select cast('31/10/2009' as datetime) -- fails

Вы можете получить текущую настройку формата даты с помощью DBCC :

dbcc useroptions

A список доступных языков с их форматом даты доступен по адресу:

exec sp_helplanguage

Для меня язык под названием "британский" имеет формат даты dmy. Таким образом, вы можете изменить язык по умолчанию для вашего имени входа на британский (со страницы свойств вашего имени входа). Вы даже можете указать его в строке подключения :

Server=<server>;Uid=<login>;Pwd=<password>;Current Language=British
2 голосов
/ 01 ноября 2009

Вы можете преобразовать дату в формат YYYY-MM-DD перед отправкой на сервер.

0 голосов
/ 02 ноября 2009

То, как форматируется дата, на самом деле является интерфейсом. Если вы смотрите исключительно на даты данных, ВСЕГДА должны быть в одном конкретном формате YYYY/MM/DD.

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

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

0 голосов
/ 02 ноября 2009

Даты считываются в американском формате, где это возможно, поэтому «31.10.2009» должен быть британским форматом, но «03.11.2009» переходит на 11 марта. Это портит ваш путь, возвращаясь назад во времени.

Не знаю, сработает ли это для вас, но мы всегда используем формат дд-ммм-гггг:

select * from productratedates where RateDate BETWEEN '31-oct-2009' AND '03-nov-2009'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...