我正在使用SQLite和python。我有一个包含两个字段的数据库(时间戳,阅读)。
时间戳是ISO8601字符串,格式如下" YYYY-MM-DD HH:MM:SS.SSSSSS"。
当我运行此SQL查询时:
SELECT timestamp, value FROM 'readings' WHERE timestamp > datetime('2017-08-30 14:19:28.684314')
我得到所有适当的读数,其中时间戳是自提供日期以来的时间戳,但我也从我传入的日期时间读取(在示例中:' 2017-08-30 14:19:28.684314&# 39)。
我的问题是为什么大于比较运算符假装它大于或等于运算符?
答案 0 :(得分:1)
SQLite没有时间戳的单独数据类型。
datetime()
只返回SQLite默认格式的字符串:
> select datetime('2017-08-30 14:19:28.684314');
2017-08-30 14:19:28
这不包括毫秒。因此,比较最终在一个字符串之间,毫秒数与一个没有毫秒的字符串相对应;第一个更大,因为(在前19个字符相等之后)它有更多的字符。
在两个值上调用datetime()
会从两个值中删除毫秒数。
最好不要在两个值上调用datetime()
并直接比较它们。
答案 1 :(得分:0)
我解决了这个问题。我会在这里详细说明,以防其他人有用。
这是我的查询。 SQLite没有日期或日期时间的直接类型。
我的旧查询:
SELECT timestamp, value FROM 'readings' WHERE timestamp > datetime('2017-08-30 14:19:28.684314')
隐含地依赖SQL来确定时间戳字段是一个日期时间。 SQLite在内部将它们存储为 TEXT 字段。
当我将查询修改为以下内容时:
SELECT timestamp, value FROM 'readings' WHERE datetime(timestamp) > datetime('2017-08-30 14:19:28.684314')
我开始得到我期待的结果。