2017-08-30 67 views
0

我使用SQLite与python。我有一个数据库有两个字段(时间戳,阅读)。大于比较的SQLite也返回相同的值。

时间戳是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')。

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

+0

嗯,而不是一个_SQLite_(事实上任何_DB_系统)专家,但有2件事情在我的脑海里:要么* micro * s被舍入为6位数,要么有一些转换涉及日期本地化(加/减)几小时/分钟。 – CristiFati

+0

我曾考虑过这个问题,但是我否认了它,因为我认为系统会以相同的方式围绕相同的输入日期时间。这在理论上意味着即使舍入也不应该将输入值作为有效的响应返回。 – badrobit

回答

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

我开始,我期待的结果。

1

SQLite没有单独的时间戳数据类型。

datetime()回报只是SQLite中的默认格式的字符串:

> select datetime('2017-08-30 14:19:28.684314'); 
2017-08-30 14:19:28 

这不包括毫秒。因此,比较结束于毫秒的字符串与没有毫秒的字符串之间;第一个更大,因为(在前19个字符相等之后)它具有更多字符。

在两个值上调用datetime()都会从两个值中移除毫秒。 对这两个值分别调用datetime()或直接进行比较可能会更好。

相关问题