如何在 SQLITE3 中查询最近的行

Posted

技术标签:

【中文标题】如何在 SQLITE3 中查询最近的行【英文标题】:How to Query for Recent Rows in SQLITE3 【发布时间】:2018-01-24 18:14:21 【问题描述】:

我正在使用 SQLite3 并尝试查询最近的行。所以我让 SQLite3 使用strftime('%s','now') 在每一行中插入一个 unix 时间戳。我的表如下所示:

CREATE TABLE test(id INTEGER PRIMARY KEY, time);

INSERT INTO test (time) VALUES (strftime('%s','now')); --Repeated


SELECT * FROM test;
1|1516816522
2|1516816634
3|1516816646 --etc lots of rows

现在我只想查询最近的条目,例如,我试图获取过去一小时内的所有行。我正在尝试以下 SQL 查询:

SELECT * FROM test WHERE time > strftime('%s','now')-60*60;

但是,无论time 列中的值如何,它总是返回所有行。我真的不知道发生了什么。

此外,如果我输入WHERE time > strftime('%s','now'),它不会返回任何内容(这是预期的),但如果我输入WHERE time > strftime('%s','now')-1,它会返回所有内容。我不知道为什么。

这里还有一个例子:

sqlite> SELECT , strftime('%s','now')-1 AS window FROM test WHERE time > window;
1|1516816522|1516817482
2|1516816634|1516817482
3|1516816646|1516817482

好像SQLite3认为中间列的值大于右列的值!?

这根本不是我所期望的。有人可以告诉我发生了什么吗?谢谢!

【问题讨论】:

【参考方案1】:

strftime() 的目的是格式化值,所以它返回一个字符串。

当您尝试对其返回值进行计算时,数据库必须将其转换为数字。并且数字和字符串不能直接相互比较。

您必须确保比较中的两个值具有相同的数据类型。 最好的方法是将数字存储在表格中:

INSERT INTO test (time)
VALUES (CAST(strftime('%s','now') AS MAKE_THIS_A_NUMBER_PLEASE));

(或者只是将列类型声明为numeric affinity。)

【讨论】:

有没有比strftime()更好的方法来获取当前时间戳?

以上是关于如何在 SQLITE3 中查询最近的行的主要内容,如果未能解决你的问题,请参考以下文章

带有 FTS4 表的 sqlite3:查询返回错误的行

Sqlite3 从列中具有相似值的行获取数据

如何使用 ROWID 在 Python SQLite3 中编辑特定行的内容

如何使用 sequelize 基于 sqlite3 中的“日期”列进行查询?

SQLITE3 - 删除具有相同值的多个列的行

如何根据在选取器视图中选择的行组件更新表视图数据