SQLite大于比较也返回相等的值。

时间:2017-08-30 18:39:25

标签: python sqlite date datetime

我正在使用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)。

我的问题是为什么大于比较运算符假装它大于或等于运算符?

2 个答案:

答案 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')

我开始得到我期待的结果。