2013-03-22 80 views
0

我意識到這是一個相對基本的問題,但是日期總是讓我感到困擾,我想確保我正確地做到這一點(此審計將被提升爲老闆)。使用sql server 2008 r2。下面是我想要的一些sudo代碼查看訂單僅限今天

我應該提到transactionDate目前是一個日期時間。這是否改變了事情?

DELCARE 
    @today datetime, 
    @tomorrow datetime 

SET @today = --CODE TO GET THE DATE FOR TODAY 
SET @tomorrow = --CODE TO GET THE DATE FOR TOMORROW 

SELECT * 
FROM table 
WHERE custID = '788' 
    AND status = 'Cancelled' 
    AND transactionDate --IS ONLY TODAY AND NOT TOMORROW OR ANY DAY AFTER 
+0

什麼樣的數據,你在transactionDate列? – 2013-03-22 20:35:46

+0

datetime。編輯我的帖子反映。 – mhopkins321 2013-03-22 20:43:48

回答

2

如果您使用的是日期,那麼您應該使用date數據類型。下面是一個版本的查詢:

SELECT * 
FROM table 
WHERE custID = '788' 
    AND status = 'Cancelled' 
    AND cast(transactionDate as date) = cast(getdate() as date) 

你也可以寫爲:

select * 
from table 
where custId = '788' and status = 'Cancelled' and 
     TransactionDate >= cast(getdate() as date) and 
     TransactionDate < cast(getdate() + 1 as date) 

我想投被用來防止索引,但阿龍開導我,否則的意見。 Here是對SQL Server中可保存性的更廣泛的解釋。

+0

爲什麼你想要明天匹配?另外,我會小心使用+1速記...在2008年的許多情況下它都是無效的。 – 2013-03-22 20:37:40

+0

我應該提到transactionDate目前是一個日期時間。這是否改變了事情? – mhopkins321 2013-03-22 20:42:43

+0

@AaronBertrand。 。 。我誤解了這個情況。我真的認爲它基本上是「今天或明天,但沒有任何一天」。 – 2013-03-22 20:43:02

7

如果transactionDateDATETIME,則:

AND CONVERT(DATE, TransactionDate) = CONVERT(DATE, CURRENT_TIMESTAMP); 

如果transactionDateDATE,則:

AND transactionDate = CONVERT(DATE, CURRENT_TIMESTAMP); 

這兩個仍然會使用索引上transactionDate,但是這是一個特例。通常情況下,第一種形式會破壞可收縮性。

+0

+1 - 男人,我不能打得夠快 - 很好的答案! – sgeddes 2013-03-22 20:36:53

+0

我應該提到transactionDate目前是一個日期時間。這是否改變了事情? – mhopkins321 2013-03-22 20:43:26

+0

@ mhopkins321 nope。你試過了嗎?如果它只存儲一個日期(或者你只關心日期部分),你是否考慮過使用'DATE'? – 2013-03-22 20:46:46

0

這可能會幫助你,只要你輸入的日期


SELECT * 
FROM table 
WHERE custID = '788' 
    AND status = 'Cancelled' 
    AND DATEDIFF(DD,GETDATE(),transactionDate)=0 
+0

我應該提到transactionDate目前是一個日期時間。這是否改變了事情? – mhopkins321 2013-03-22 20:44:32

+0

不,它不是,使用DATEDIFF將是正確的。 – ljh 2013-03-22 20:46:35

+1

只需注意,大多數對列的函數都會使其不可搜索 - 這意味着可能的搜索將不得不成爲掃描。這通常會使性能變得糟糕。像'DD'這樣的懶惰速記也很危險。例如,猜猜DATEPART(Y,GETDATE());'返回什麼?如果你猜對了3或13或2013,你會錯的。 – 2013-03-22 20:51:54

0

更換GETDATE()那麼有幾個方法可以做到這一點,因爲其他人發佈。

,最好的辦法是簡單地設置

where transactionDate = @toDay 

這種方法將工作,如果transactionDate只包含日期部分(沒有小時和分鐘,所以在午夜),然後@Today是一樣的,只是爲GETDATE()或類似的。

正如ljh寫道,你也可以在當天做一個DATEDIFF,但這將是廣泛的,因爲它會在每一行做DATEDIFF - 效率不高。

但是,您可以檢查日期,所以像這樣。

WHERE transactionDate >= '2013-03-22' and transactionDate < '2013-03-23' 
--Substitute the chars for variables 

這會給你在哪裏transactionDate是午夜,以及接下來的午夜之間發生的所有行。

編輯:我剛剛看到戈登回答同樣的事情,並且包括那部分關於可用的索引,我忘記了補充。

編輯:正如亞倫指出的,之間不是一件好事。這是一段時間,因爲我實際上寫了任何非adhoc的SQL,所以我往往忘記這樣的東西:(

+0

哦,不,請[請不要使用BETWEEN進行日期/範圍查詢](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-魔鬼有功能於common.aspx)。 – 2013-03-22 20:54:55

+0

糟糕,鍵盤有點太快了。 – 2013-03-22 20:59:42