选择发生的记录更有效率' - 在另一条记录中的日期的00:00:00至23:59:59,在同一个JOIN中

时间:2015-06-12 12:34:59

标签: sql sql-server sql-server-2008 tsql

我想获取给定日期/ 1天间隔的记录数据。

这意味着当天从00:00:0023:59:59。日期值来自连接语句中的另一个表...即,它不是参数。

假设我的Transactions表格带有DateOccuredDatetime)字段

根据我的研究,我有两种可能的选择(其中包括)。

  1. 计算当天的日期时间范围值

    来自00:00:00

    DateAdd(dd,DateDiff(dd,0,Transaction.DateOccured,0)

    23:59:59

    DateAdd(dd,1,DateAdd(ss,-1,CONVERT(DATE,Transaction.DateOccured))) - 第二天午夜前1秒

  2. (执行此操作的几个选项,例如将其放在SELECT列表中或将其放在WHERE子句中)

    1. Datetime转换为日期,然后附加相应的字符串(针对时间部分)以创建范围(似乎效率不高)
    2. 哪种策略最好?

      我会将此计算放在SELECT列表中并用作WHERE中的字段吗?或者在WHERE条款

      中更好

1 个答案:

答案 0 :(得分:9)

最简单的方法是:

on cast(t.dateoccurred as date) = t2.otherdate

这可以在第一张表上使用索引(参见Martin Smith的评论)。它绝对可以利用第二个表上的索引。

以下版本也可以在第一个表上使用索引,但不能在第二个表上使用索引:

on t.dateocurred >= t2.otherdate and
   t.dateoccurred < dateadd(day, 1, t2.otherdate)