2009-06-04 108 views
3

使用SQL Server 2005 Express。使用'between'與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之後,「between」仍然具有預期的行爲嗎?

謝謝

+0

Define'expected' – 2009-06-04 01:18:52

+0

這個轉換應該轉換,比方說 2009-06-06 12:12:00到12:12 :00 我想比較時間(不管他們的原始日期)。 因此,12:12:00 <13:10:00(即使13:10:00本來是在2009-01-01) – 2009-06-04 01:21:28

回答

2

是的,具體取決於您期望的行爲。之間運營商將把這些操作數爲VARCHAR處理,並相應地應用其比較規則:

返回TRUE之間。如果與test_expression的價值 大於或 等於與begin_expression 的值且小於或等於end_expression的值爲 。

現在,我可以看到很多潛在的問題,比較字符串和期望的日期比較行爲。我在測試中沒有看到任何信息,但仔細看看您的數據。 CONVERT是否返回24小時制,並帶有相應的前導零?

This question還有其他一些比較無日期時間的方法,除了將它們轉換爲varchars之外。

另外,注意空日期,這將導致相應的WHERE條件返回false(實際上,未知)。

在您的其他問題中,您表示您遇到錯誤。如果是這樣,你可以發佈嗎?

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