SQL Query提供昨天上午12:00到下午11:59之间的数据

时间:2018-05-21 09:36:20

标签: sql sql-server tsql

我有一个查询,其中包含以下条件,以提供昨天至上午12点至下午11:59之间的数据

Select * from table where passDate >= DATEADD(DAY, -1, convert(date, GETDATE()))
and passDate < convert(date, GETDATE())

passDate是一个dateTime列。

上述产量是否需要结果?除了上述之外,还有更好的方法吗?

4 个答案:

答案 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()))