我在该表中有一个名为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
。
这是一个错误还是我做错了什么?
答案 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'