2009-06-04 7 views
3

Использование SQL Server 2005 Express.использовать 'между' с varchar (sql server)

(
    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) 
) 

Будет ли «между» все еще иметь ожидаемое поведение после того, как данные были преобразованы в varchar?

Благодаря

+0

Определить «ожидаемый» –

+0

Этот конвертер предполагается преобразовать, скажем 2009-06-06 12:12:00 к 12:12 : 00 Я хочу сравнить времена (независимо от их исходных дат). Итак, 12:12:00 <13:10:00 (даже если 13:10:00 изначально был на 2009-01-01) –

ответ

2

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

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

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

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

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

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

+0

Итак, я что-то здесь помог? Что это было? –

0

Ваше первое условие эквивалентно этого более индекса дружной один:

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

(объяснено здесь: Reuse Your Code with Table-Valued UDFs ) .

0

Как я сказал в вашем другом сообщении, если это возможно, вам стоит подумать о переходе на SQL 2008 из-за t he new datetime types that allow explicit separation of date part and time part, чтобы ваши выражения фильтра стали намного проще, и вы можете индексировать по времени. Поскольку его Экспресс действительно не должно быть никаких оснований удерживать вас в 2005 году.

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