3

使用 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”是否仍具有预期的行为?

谢谢

4

3 回答 3

2

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

如果 test_expression 的值大于或等于 begin_expression 的值且小于或等于 end_expression 的值,则 BETWEEN 返回 TRUE。

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

这个问题有一些其他方法来比较无日期时间,而不是将它们转换为 varchars。

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

在您的另一个问题中,您表示您遇到了错误。如果是这样,你可以发布吗?

于 2009-06-04T01:22:27.743 回答
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 )。

于 2009-06-04T01:38:05.263 回答
0

正如我在您的另一篇文章中所说,如果可能,您应该考虑迁移到 SQL 2008,因为新的日期时间类型允许明确分隔日期部分和时间部分,因此您的过滤器表达式变得更加简单,并且您可以按时间索引。既然它的快递,真的不应该有任何理由阻止你在 2005 年。

于 2009-06-04T02:00:42.643 回答