2016-07-15 158 views
2

第1個查詢如何返回今天和昨天的記錄,但第2個查詢僅返回昨天的記錄?SQL日期比較問題

SELECT 
    * 
FROM 
    table 
WHERE 
    DateTimeOfInsert >= '20160714' 

第二

SELECT 
    * 
FROM 
    table 
WHERE 
    DateTimeOfInsert >= '20160714' 
    AND 
    DateTimeOfInsert <= '20160715' 

,因爲它允許僅提供start/end日期之一,我不能用BETWEEN

+0

您需要更改DateTimeOfInsert <= '20160715',以DateTimeOfInsert < '20160716' –

+0

@JatinPatel但是,爲什麼? '<='應該可以,不是嗎? – fishmong3r

+1

當您只提供沒有時間的日期部分時,它只會匹配到一天的午夜。如果午夜過後,它會忽略日期。 –

回答

4

你錯過了時間。您在技術上尋找2016-07-14 00:00:00至2016-07-15 00:00:00,其中僅包含2016-07-14數據。

如果你需要找到兩個2天,然後:

SELECT 
    * 
FROM 
    table 
WHERE 
    DateTimeOfInsert >= '2016-07-14 00:00:00' 
    AND 
    DateTimeOfInsert <= '2016-07-15 23:59:59' 

或者乾脆用這個第二個條件

DateTimeOfInsert <= '20160716' 

其2016年7月14日00:00之間的暗示: 00至2016-07-16 00:00:00

+0

剛剛實現。使用'CAST(DateTimeOfInsert AS DATE)'。不過謝謝。 – fishmong3r

+0

而不是將該列轉換爲日期,最好調整參數或固定值以包含直到一天結束的時間。它會在性能上更好 –

+0

@JatinPatel我在聽。 CAST在性能方面更糟糕? – fishmong3r

0

爲什麼不使用BETWEENstatement

您的查詢應該是這個樣子:

SELECT * 
FROM table 
WHERE DateTimeOfInsert >= '2016-07-14 00:00:00' 
AND DateTimeOfInsert < '2016-07-16 00:00:00' 
+0

請閱讀我的問題。我解釋了爲什麼我不能使用'BETWEEN'。 – fishmong3r

+1

因此,您希望在午夜前的最後一秒忽略發生的所有事情* (非零毫秒值)。這就是爲什麼大多數人建議不要使用'BETWEEN'並使用'<'而不是'<='。 * exclusive *端點往往易於計算,並且不依賴於正在使用的數據類型的精度。 –

+0

'DateTimeOfInsert>'2016-07-14 00:00:00''(exclusive)應該是'DateTimeOfInsert> ='2016-07-14 00:00:00''(含),但結束條件是正確的。 – Lucero