使用'between'与varchar(sql server)

时间:2009-06-04 01:16:28

标签: sql sql-server-2005 datetime between

使用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)
)

在将日期时间转换为varchar之后,“between”是否仍然具有预期的行为?

由于

3 个答案:

答案 0 :(得分:2)

是的,取决于您对预期行为的意思。 BETWEEN运算符将这些操作数视为varchars,并相应地应用其比较规则:

  

如果值为BETWEEN,则返回TRUE   test_expression的大于或   等于begin_expression的值   并且小于或等于   end_expression具有

现在,我可以看到很多潜在的问题,比较字符串和期待日期比较行为。我在测试中没有看到任何内容,但请仔细查看您的数据。 CONVERT是否以24小时的时间返回,并带有适当的前导零?

除了将无日历时间转换为varchars之外,

This question还有一些比较无日期时间的方法。

此外,请注意空日期,这将导致相应的WHERE条件返回false(实际上,未知)。

在您的其他问题中,您表示您收到了错误消息。如果是这样,你可以发布吗?

答案 1 :(得分: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

答案 2 :(得分:0)

正如我在你的另一篇文章中所述,如果可能你应该考虑转移到SQL 2008因为t he new datetime types that allow explicit separation of date part and time part所以你的过滤器表达式变得更简单,你可以按时间索引。因为它的Express在2005年确实没有任何理由阻止你。