2016-07-15 159 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