我有一个查询,其中包含以下条件,以提供昨天至上午12点至下午11:59之间的数据
Select * from table where passDate >= DATEADD(DAY, -1, convert(date, GETDATE()))
and passDate < convert(date, GETDATE())
passDate
是一个dateTime列。
上述产量是否需要结果?除了上述之外,还有更好的方法吗?
答案 0 :(得分:2)
如果您无法从WHERE子句中删除GETDATE(),这可能是一个更易于阅读的解决方案。
Select
*
from
table
where
DATEDIFF(DD,passdate,GETDATE()) = 1
但它不是最有效的解决方案。
将GETDATE()预加载到变量
中是理想的DECLARE @d DATE = GETDATE();
Select
*
from
table
where
DATEDIFF(DD,passdate,@d) = 1
如果[passdate]上有索引,那么理想情况下你应该尝试避免WHERE子句中的函数,因为它会影响SQL Server使用索引的能力。
这里有一些更友好的索引(但需要针对你的环境进行调整),但为了正确地做到这一点,变量应该是dame数据类型作为[passdate]列,以避免隐式转换。
DECLARE @start DATE = DATEADD(DD,-1,GETDATE());
DECLARE @end DATE = GETDATE();
Select
*
from
table
where
passdate >= @start
AND
passdate < @end
答案 1 :(得分:0)
DECLARE @MidNightToday datetime;
DECLARE @MidNightYesterday datetime;
SET @MidNightToday = Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()));
SET @MidNightYesterday = Convert(DateTime, DATEDIFF(DAY, 1, GETDATE()));
Select * from table where passDate between @MidNightYesterday and
@MidNightToday;
答案 2 :(得分:0)
这将为您提供所需的结果:
declare @start datetime = cast(cast(dateadd(day, -1, getdate()) as date) as datetime)
declare @end datetime = dateadd(hour, 12, @start)
--to see, that these are correct boundaries
--select @start, @end
-- today it would return
-- 2018-05-20 00:00:00.000 | 2018-05-20 12:00:00.000
select * from TBL
where passDate between @start and @end
答案 3 :(得分:0)
令人惊讶的是,Brent Ozar的这种方法在破坏可攻击性规则的同时使用了索引,正如我所理解的那样:
https://www.brentozar.com/archive/2016/12/date-math-clause/
如果使用索引,此方法应产生最佳结果:
Select *
from table
where convert(date, [passDate]) = dateadd(d,-1, convert(date, getdate()))