Вопрос

Использование SQL Server 2005 Express.

(
    CONVERT(VARCHAR(8), R.reviewStart, 108) between CONVERT(VARCHAR(8), M.meetingStart, 108) and CONVERT(VARCHAR(8), M.meetingEnd, 108) OR
    CONVERT(VARCHAR(8), R.reviewEnd, 108) between CONVERT(VARCHAR(8), M.meetingStart, 108) and CONVERT(VARCHAR(8), M.meetingEnd, 108) OR
    CONVERT(VARCHAR(8), M.meetingStart, 108) between CONVERT(VARCHAR(8), R.reviewStart, 108) and CONVERT(VARCHAR(8), R.reviewEnd, 108) OR
    CONVERT(VARCHAR(8), M.meetingEnd, 108) between CONVERT(VARCHAR(8), R.reviewStart, 108) and CONVERT(VARCHAR(8), R.reviewEnd, 108)
)

Будет ли "between" по-прежнему иметь ожидаемое поведение после преобразования datetimes в varchar?

Спасибо

Это было полезно?

Решение

Да, в зависимости от того, что вы подразумеваете под ожидаемым поведением.Оператор BETWEEN будет обрабатывать эти операнды как переменные и соответствующим образом применять свои правила сравнения:

BETWEEN возвращает TRUE, если значение test_expression больше или равно значению begin_expression и меньше или равно значению end_expression.

Теперь я вижу множество потенциальных проблем, сравнивая строки и ожидая поведения при сравнении дат.Я не видел ни одного из них в своих тестах, но внимательно посмотрите на свои данные.Возвращает ли преобразование 24-часовое время с соответствующими начальными нулями?

Этот вопрос имеет несколько других подходов к сравнению времен без даты, отличных от преобразования их в переменные.

Кроме того, следите за нулевыми датами, что приведет к тому, что соответствующее условие WHERE вернет false (на самом деле, неизвестно).

В вашем другом вопросе вы указали, что получаете сообщение об ошибке.Если да, можете ли вы опубликовать это?

Другие советы

Как я уже говорил в вашем другом посте, если это возможно, вам следует рассмотреть возможность перехода на SQL 2008 из-за tэто новые типы datetime, которые допускают явное разделение части даты и части времени таким образом, ваши выражения фильтра становятся намного проще, и вы можете индексировать по времени.Поскольку это Экспресс, действительно не должно быть никаких причин задерживать вас в 2005 году.

Ваше первое условие эквивалентно этому, более удобному для индекса:

R.reviewStart >=  DATEADD(day, DATEDIFF(day, '19010101', M.meetingStart), '19010101') 
and R.reviewStart < DATEADD(day, 1+DATEDIFF(day, '19010101', M.meetingStart), '19010101') 

(объяснено здесь:Повторно используйте свой код с помощью табличных UDFS ) .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top