所以,我一直在敲打这个墙上的几个墙(并在这里寻找答案,否则在哪里)。
以下是我用过的搜索,以便更接近我想要的结果。
我是sqLite /数据库的新手,如果我没有完全理解,请提前对不起。
以下是我尝试过的内容:
datetime(1536115105.62894, 'unixepoch'); -- used this to test the timestamps
SELECT strftime('%Y-%m-%d 23:59', 'now', 'localtime'); --- grabs todays date, localtime, sets to 11:59pm
SELECT strftime('%Y-%m-%d 23:59', 'now', 'localtime'); --- grabs todays date, localtime, sets to 00:00am
SELECT * FROM transactions WHERE timestamps BETWEEN strftime('%Y-%m-%d 23:59', 'now', 'localtime') AND strftime('%Y-%m-%d 23:59', 'now', 'localtime'); --- returns nothing.
SELECT * FROM transactions WHERE timestamps > strftime('%Y-%m-%d 00:00', 'now', 'localtime'); -- returns nothing.
SELECT * FROM transactions WHERE timestamps < strftime('%Y-%m-%d 00:00', 'now', 'localtime'); -- returns everything, which is confusing as there are transactions after this time?
.schema for'transaction'
CREATE TABLE transactions (id INTEGER PRIMARY KEY, amounts INTEGER(20), timestamps INTEGER(20));
'交易'数据/表格如下。
id amounts timestamps
---------- ---------- ----------------
1 450 1536115105.62894
2 450 1536115105.62894
3 450 1536115105.62894
4 551 1536115603.29054
5 10431 1536115603.29054
6 20004 1536115603.29054
7 450 1536115603.29054
8 123 1536115603.29054
9 1244 1536115603.29054
10 201 1536119203
11 1100 1536118253.46948
12 1100 1536118253.46948
13 1100 1535599853
14 1100 1535599853
15 1100 1535599853
16 123 1535945759
17 1200 1536032309
18 450 1536161578
19 450 1536161578
20 450 1536161578
21 100 1536507178
22 100 1536507178
23 100 1536507178
24 25 1534260778
25 25 1534260778
26 25 1534260778
我相信以下可能是解决方案的基础。基本上它将日期/时间值转换为相同的格式进行比较。
这会将timestamp列转换为日期时间格式(yyyy-mm-dd hh:mm:ss)以进行比较: -
SELECT *
FROM transactions
WHERE datetime(timestamps,'unixepoch') BETWEEN '2018-09-05 02:00' AND '2018-09-05 23:59'
;
这会将要比较的值转换为时间戳格式(下降千分之一): -
SELECT *
FROM transactions
WHERE timestamps BETWEEN strftime('%s', '2018-09-05 02:00') AND strftime('%s', '2018-09-05 23:59')
;
这是用于测试上述内容的完整SQL: -
DROP TABLE If EXISTS transactions;
CREATE TABLE IF NOT EXISTS transactions (id INTEGER PRIMARY KEY, amounts INTEGER(20), timestamps INTEGER(20));
INSERT INTO transactions (amounts, timestamps) VALUES
(450,1536115105.62894),
(450,1536115105.62894),
(450,1536115105.62894),
(551,1537115603.29054)
;
SELECT *,
datetime(timestamps,'unixepoch') AS dt,
strftime('%Y-%m-%d 02:00','2018-09-05') AS cmprtime1,
strftime('%Y-%m-%d 23:59','2018-09-05') AS cmprtime2,
strftime('%s','2018-09-05 02:00') AS cmprts1,
strftime('%s','2018-09-05 23:59') AS cmprts2
FROM transactions;
SELECT *
FROM transactions
WHERE datetime(timestamps,'unixepoch') BETWEEN '2018-09-05 02:00' AND '2018-09-05 23:59'
;
SELECT *
FROM transactions
WHERE timestamps BETWEEN strftime('%s', '2018-09-05 02:00') AND strftime('%s', '2018-09-05 23:59')
;
运行上述结果的结果是: -
第一个查询(演示转换后的值): -
第二个查询(将timestamp列转换为datetime格式进行比较)(选择4中的3个): -
第三个查询(将比较值转换为时间戳)(选择4中的3个): -
strftime()
返回一个字符串(就像你的一些格式的'2018-09-05 00:00'
)。你将那个字符串与1536115105.62894
之类的东西进行比较。
如果你的timestamps列被声明为持有REAL值,那么sqlite会尝试将'2018-09-05 00:00'
无损转换为数字,但这会失败。并且由于它失败了,它会回退到非转换比较,其中所有数值都小于任何字符串。
如果时间戳是TEXT列,那么'1536115105.62894'
将小于'2018-09-05 00:00'
。
编辑:
所以,如果你想比较时间,你必须以相同的形式比较它们 - 比较格式相同的字符串(不要将'YYYY-mm-DD'
与'HH:MM'
进行比较),或者数字意味着相同的事情(不要比较朱利安日一个unix时间),无论你喜欢什么形式(数字会变得更有效率)。但是你不能将一个拥有人类可读时间的字符串与秒数进行比较并期望它能够正常工作。