如果日期相等,则运算符之间不返回任何值

时间:2018-04-03 11:18:04

标签: sql sqlite

我在该表中有一个名为Products的表,我有三条记录:

ID | Price | Date
 1   20.0    2018-04-03 18:30:00
 2   30.00   2018-04-03 18:30:00
 3   30.00   2018-04-04 18:30:00

我希望返回所有记录为Date 2018-04-01(开始日期)和2018-04-03(结束日期)的记录。最终结果应为(id):1,2

我的查询有这样的语法:

SELECT * FROM Products WHERE datetime BETWEEN '2018-04-03' AND '2018-04-03'

当我在DB Browser for Slite实用程序中执行它时,我收到以下消息:

  

在0ms内返回0行:SELECT * FROM Products WHERE datetime BETWEEN' 2018-04-03' AND' 2018-04-03'

但是如果我在:

编辑查询
SELECT * FROM Products WHERE datetime BETWEEN '2018-04-03' AND '2018-04-04'

我使用ids正确获取记录:2, 3

这是一个错误还是我做错了什么?

3 个答案:

答案 0 :(得分:2)

没有时间的日期恰好是午夜。如果您想要该日期的数据,我建议:

SELECT p.*
FROM Products p
WHERE datetime >= '2018-04-03' AND datetime < '2018-04-04';

这将在2018-04-03返回所有时间。

我强烈反对将between与日期/时间一起使用。由于时间成分,这只是令人困惑。 Aaron Bertrand在这个主题上有一个相当广泛的博客,What Do The Devil and Between Have In Common。虽然该博客适用于SQL Server,但它也适用于其他数据库。

答案 1 :(得分:1)

戈登答案的另一种选择,也就是生产中应该使用的答案,使用BETWEEN,但具有适当的范围:

SELECT *
FROM Products 
WHERE datetime BETWEEN '2018-04-03 00:00:00' AND '2018-04-03 23:59:59';

BETWEEN包含两端,因此上述内容包括2018年4月的第三天,从午夜到同一天午夜之前的一秒钟。

答案 2 :(得分:-1)

SELECT * FROM Products WHERE cast(datetime as date) BETWEEN '2018-04-03' AND '2018-04-03'