TSQL SELECT上一个日期的记录

时间:2011-06-08 13:26:16

标签: sql sql-server-2005 tsql datetime

我想从表格Log中选择所有记录,其中DateAndTime字段值(类型datetime)是今天的前一天,无论它是什么日子。

因此,如果今天是2011-06-08,我想选择DateAndTime大于或等于2011-06-07 00:00:00且小于2011-06-08 00:00:00的所有行。

我猜这里潜在的陷阱是这个月的第一天的行为,因为2011-06-00之类的日期显然是无效的,应该是2011-05-31

5 个答案:

答案 0 :(得分:27)

对于SQL Server 2008,您可以使用此功能。

select *
from [log]
where cast(DateAndTime as date) = cast(getdate()-1 as date)

2008年之前你可以使用这个

select *
from [log]
where DateAndTime >= dateadd(d, datediff(d, 0, getdate())-1, 0) and
      DateAndTime < dateadd(d, datediff(d, 0, getdate()), 0)

与DBA相关:Cast to date is sargable but is it a good idea?

答案 1 :(得分:3)

SELECT * FROM Log
WHERE DateAndTime >= DATEADD(DAY,-1, CAST(GETDATE() AS DATE))
AND DateAndTime < CAST(CAST(GETDATE() AS DATE) AS DATETIME)

答案 2 :(得分:1)

此示例假定SQL Server:

select *
from log
where convert(varchar(8), DateAndTime , 112)  = convert(varchar(8), getdate()-1, 112)

基本上,将日期转换为yyyymmdd(112参数),然后检查它是否等于昨天的日期(getdate()-1),也转换为yyyymmdd。

答案 3 :(得分:0)

假设SQL Server

 declare @today date
 set @today = GETDATE()

 select * from Log where DateAndTime between DATEADD(dd, -1, @today ) and @today

答案 4 :(得分:0)

它应该包括条件运算符而不是之间的。 否则它也包括今天的记录。

Declare @today date
Set @today = GETDATE()


Select YourcolumnNames from log
Where DateAndTime >= DATEADD(dd, -1, @today ) and DateAndTime < DATEADD(dd, -1, @today )

此外,您应该在select语句中提及列名和*。这可以提高性能