如何在 SQLITE3 中查询最近的行
How to Query for Recent Rows in SQLITE3
我正在使用 SQLite3 并尝试查询最近的行。所以我让 SQLite3 使用 strftime('%s','now')
在每一行中插入一个 unix 时间戳。我的 Table 看起来像这样:
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
列中的值如何,总是 return 所有行。真不知道怎么回事
此外,如果我输入 WHERE time > strftime('%s','now')
,它会 return 什么都没有(这是预期的),但如果我输入 WHERE time > strftime('%s','now')-1
,那么它会 return 一切。不知道为什么。
这里还有一个例子:
sqlite> SELECT , strftime('%s','now')-1 AS window FROM test WHERE time > window;
1|1516816522|1516817482
2|1516816634|1516817482
3|1516816646|1516817482
似乎SQLite3认为中间栏的值大于右栏的值!?
这完全不是我所期望的。有人可以告诉我发生了什么事吗?谢谢!
strftime()
的目的是 格式化 值,因此它 return 是一个字符串。
当您尝试使用其 return 值进行计算时,数据库必须将其转换为数字。而且数字和字符串不能直接相互比较。
您必须确保比较中的两个值具有相同的数据类型。
最好的方法是将数字存储在 table:
INSERT INTO test (time)
VALUES (CAST(strftime('%s','now') AS MAKE_THIS_A_NUMBER_PLEASE));
(或者只是将列类型声明为 numeric affinity。)
我正在使用 SQLite3 并尝试查询最近的行。所以我让 SQLite3 使用 strftime('%s','now')
在每一行中插入一个 unix 时间戳。我的 Table 看起来像这样:
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
列中的值如何,总是 return 所有行。真不知道怎么回事
此外,如果我输入 WHERE time > strftime('%s','now')
,它会 return 什么都没有(这是预期的),但如果我输入 WHERE time > strftime('%s','now')-1
,那么它会 return 一切。不知道为什么。
这里还有一个例子:
sqlite> SELECT , strftime('%s','now')-1 AS window FROM test WHERE time > window;
1|1516816522|1516817482
2|1516816634|1516817482
3|1516816646|1516817482
似乎SQLite3认为中间栏的值大于右栏的值!?
这完全不是我所期望的。有人可以告诉我发生了什么事吗?谢谢!
strftime()
的目的是 格式化 值,因此它 return 是一个字符串。
当您尝试使用其 return 值进行计算时,数据库必须将其转换为数字。而且数字和字符串不能直接相互比较。
您必须确保比较中的两个值具有相同的数据类型。 最好的方法是将数字存储在 table:
INSERT INTO test (time)
VALUES (CAST(strftime('%s','now') AS MAKE_THIS_A_NUMBER_PLEASE));
(或者只是将列类型声明为 numeric affinity。)