【问题标题】:Between operator does not return any value if the dates are equal如果日期相等,Between 运算符不返回任何值
【发布时间】:2018-04-03 11:18:03
【问题描述】:

我有一个名为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 实用程序中执行它时,我收到以下消息:

0 毫秒内返回 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

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

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

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

    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 的,但它也适用于其他数据库。

    【讨论】:

    • 另一个问题是 SQLite 并没有真正的 DATETIMESTAMP 数据类型。该列可以包含 2018-04-032018-04-03 18:19:2004-03-2018 06:19:20 PM4/3/18 甚至 foobar 之类的值
    • 我在这个问题上撞了几个小时,非常感谢,我会阅读博客上的文章,祝你有美好的一天。
    【解决方案2】:

    Gordon 的答案的替代方案,这可能应该在生产中使用,应该是使用BETWEEN,但具有适当的范围:

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

    BETWEEN 包含两端,因此上述内容将包括 2018 年 4 月 3 日,即当天午夜至午夜前一秒。

    【讨论】:

      【解决方案3】:
      SELECT * FROM Products WHERE cast(datetime as date) BETWEEN '2018-04-03' AND '2018-04-03'
      

      【讨论】:

      • SQLite 没有日期类型,因此强制转换没有意义。
      猜你喜欢
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多