2011-08-08 21 views
0

現在,我使用這個命令來檢索當天的所有領域:SQL Server 2005中選擇從某個時間幀字段

SELECT COUNT(*) 
FROM [SecureOrders] 
WHERE DateTime >= DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) 
     AND 
     DateTime < DATEADD(day, DATEDIFF(day, 0, GETDATE()), 1) 

不過,我希望能夠得到那名域在昨天中午和中午之間進入 - 我該怎麼做呢?

回答

2

0.5中午(如半天)

WHERE DateTime >= DATEADD(day, DATEDIFF(day, 0, GETDATE()), -0.5) 
     AND 
     DateTime < DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0.5) 
0
DECLARE @NoonToday DATETIME; 

SET @NoonToday = DATEADD(HOUR, 12, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP)); 

SELECT COUNT(*) FROM [SecureOrders] 
WHERE [DateTime] >= DATEADD(DAY, -1, @NoonToday) 
AND [DateTime] < @NoonToday; 
0

雖然看起來很醜陋,但應該工作

SELECT 
    COUNT(*) 
FROM 
    [SecureOrders] 
WHERE 
    DateTime >= DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) - 0.5 AND DateTime < DATEADD(day, DATEDIFF(day, 0, GETDATE()), 1) + 0.5 
+1

我建議遠離日期/時間類型的隱式加/減操作。它們在SQL Server 2005中工作正常,但它們與SQL Server 2008中的新類型不兼容(可以想象,許多人在2005年關閉後將遷移到這些新類型)。這是一個更多的輸入,但DATEADD是更向前兼容,意圖更清晰。 –

+0

同意。讓我們留下這個答案,以防止其他人使用它作爲sql server 2008的解決方案(更高,我相信) – heximal

0

@Aaron Bertrand的解決方案的變化,沒有聲明一個變量和而不將一個非零整數值視爲日期:

SELECT COUNT(*) 
FROM SecureOrders o 
    CROSS JOIN (
    SELECT DATEADD(HOUR, DATEDIFF(DAY, 0, GETDATE()) * 24 + 12, 0) 
) AS d (TodayNoon) 
WHERE o.DateTime < d.TodayNoon 
    AND o.DateTime >= DATEADD(DAY, -1, d.TodayNoon) 
+0

我沒有看到任何一個評論的問題,但確定。我也沒有發現「CROSS JOIN」更容易理解......但是無論如何浮在你的船上。 :-) –

+0

不使用整數作爲日期的想法不是對時間戳的內部表示做出假設。唯一的例外是零,它用於四捨五入:此解決方案假設0代表指向某天的開始時間(無論那一天是什麼時間)的時間戳。我認爲這可能與你在評論關於避免隱含日期操作的問題時所說的內容更加一致。即在這裏,我不僅避免了隱式加/減,還避免了隱式轉換。 :) –

+0

AFAIK'CONVERT(DATETIME,DATEDIFF(DAY,0,CURRENT_TIMESTAMP))'與'DATEADD(DAY,0,DATEDIFF(DAY,0,CURRENT_TIMESTAMP))'相同' - 只要執行一些其他'DATEADD'。我明白你的意思,但整數數學的東西在SQL Server 2008中打破了*現在*;我顯示的方法在Denali CTP3中工作正常 - 一個人爲的例子:'SELECT CONVERT(DATETIME2(7),DATEADD(HOUR,5,DATEDIFF(DAY,2,CURRENT_TIMESTAMP)));'...也不知道什麼是使用變量的錯誤,我發現它有助於更​​新的人們將事情分解並更好地理解部分。 –

相關問題