尝试从sqLite数据库[iOS / mac os]中“选择”一天的项目

问题描述 投票:2回答:2

所以,我一直在敲打这个墙上的几个墙(并在这里寻找答案,否则在哪里)。

以下是我用过的搜索,以便更接近我想要的结果。

我是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      
database sqlite
2个回答
1
投票

我相信以下可能是解决方案的基础。基本上它将日期/时间值转换为相同的格式进行比较。

这会将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')
;
  • 注意当地时间,为简单起见,删除'now'。

这是用于测试上述内容的完整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')
;

运行上述结果的结果是: -

第一个查询(演示转换后的值): -

enter image description here

第二个查询(将timestamp列转换为datetime格式进行比较)(选择4中的3个): -

enter image description here

第三个查询(将比较值转换为时间戳)(选择4中的3个): -

enter image description here

  • 重申一下,转换为localtime / use现在不习惯简单。

2
投票

strftime()返回一个字符串(就像你的一些格式的'2018-09-05 00:00')。你将那个字符串与1536115105.62894之类的东西进行比较。

如果你的timestamps列被声明为持有REAL值,那么sqlite会尝试将'2018-09-05 00:00'无损转换为数字,但这会失败。并且由于它失败了,它会回退到非转换比较,其中所有数值都小于任何字符串。

如果时间戳是TEXT列,那么'1536115105.62894'将小于'2018-09-05 00:00'

More information

编辑:

所以,如果你想比较时间,你必须以相同的形式比较它们 - 比较格式相同的字符串(不要将'YYYY-mm-DD''HH:MM'进行比较),或者数字意味着相同的事情(不要比较朱利安日一个unix时间),无论你喜欢什么形式(数字会变得更有效率)。但是你不能将一个拥有人类可读时间的字符串与秒数进行比较并期望它能够正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.