2011-06-08 81 views
13

我想從表Log中選擇所有記錄,其中DateAndTime字段值(類型爲datetime)是今天之前的一天,無論它在哪一天。TSQL SELECT上一次日期的記錄

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

我猜這裏的潛在缺陷是它的行爲在一個月的第一天,因爲明顯像2011-06-00這樣的日期是無效的,應該是2011-05-31

回答

22

對於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

投射色譜柱可能會產生嚴重的性能影響,請參閱JanW的解決方案 – 2014-09-23 07:23:01

+0

@AdriaanDavel是的,它可以用基數估計。不具有可控性。您是否從我的答案中閱讀了關於DBA的問題? – 2014-09-23 07:30:58

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

這個例子假設SQL服務器:

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

從本質上講,轉換日期爲yyyymmdd(在112參數),然後檢查它等於昨天的日期(getdate()-1),也轉換爲爲yyyymmdd。

0

假設的SQL Server

declare @today date 
set @today = GETDATE() 

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

它應該包括條件運算和之間不。否則它包括今天的記錄。

Declare @today date 
Set @today = GETDATE() 


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

此外,您應該在select語句中提及列名和*應該避免。這可以提高性能