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

use*_*426 0 sql t-sql sql-server sql-server-2008

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

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

假设我有一个TransactionsDateOccured(Datetime)字段的表

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

  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秒

(这样做的几个选项,例如将其放在SELECT列表中或放在WHERE子句中)

  1. 转换Datetime为日期然后附加适当的字符串(对于时间部分)来创建范围(似乎没有效率)

哪个是最好的策略?

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

Gor*_*off 9

最简单的方法是:

on cast(t.dateoccurred as date) = t2.otherdate
Run Code Online (Sandbox Code Playgroud)

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

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

on t.dateocurred >= t2.otherdate and
   t.dateoccurred < dateadd(day, 1, t2.otherdate)
Run Code Online (Sandbox Code Playgroud)