use*_*426 0 sql t-sql sql-server sql-server-2008
我想获取给定日期/ 1天间隔的记录数据.
这意味着来自00:00:00于23:59:59那一天.日期值来自连接语句中的另一个表...即,它不是参数.
假设我有一个Transactions带DateOccured(Datetime)字段的表
根据我的研究,我有两种可能的选择(其中包括).
计算当天的日期时间范围值
从 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子句中)
Datetime为日期然后附加适当的字符串(对于时间部分)来创建范围(似乎没有效率)哪个是最好的策略?
我会将此计算放在SELECT列表中并用作WHERE?中的字段吗?或者在WHERE条款中是否更好
在最简单的方法是:
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)