为什么我的SQLite查询使用“小于或等于”而不返回“等于”部分,而仅返回“小于”部分?

时间:2019-07-23 15:04:16

标签: sqlite

我有一个SQLite数据库,其中包含以下数据:

select Id,TimeStamp from MyTable;

ID  TimeStamp
1   2019-07-15T18:18:44.829Z
2   2019-07-15T18:18:53.251Z
3   2019-07-15T18:18:59.475Z
4   2019-07-15T18:19:15.139Z
5   2019-07-15T18:20:10.499Z
6   2019-07-15T18:20:28.91Z
7   2019-07-15T20:41:32.069Z
8   2019-07-15T20:41:42.344Z
9   2019-07-15T20:42:09.124Z
10  2019-07-15T20:42:26.806Z
11  2019-07-16T15:06:27.394Z
12  2019-07-16T15:06:39.871Z
13  2019-07-16T15:06:49.397Z
14  2019-07-16T15:06:56.887Z
15  2019-07-16T15:07:04.288Z
16  2019-07-16T15:07:34.156Z
17  2019-07-16T15:07:56.606Z
18  2019-07-16T15:08:23.908Z
19  2019-07-16T15:08:51.135Z
20  2019-07-16T15:09:29.955Z
21  2019-07-16T15:09:57.523Z
22  2019-07-16T15:10:17.277Z
23  2019-07-16T15:10:43.056Z
24  2019-07-16T15:10:53.924Z
25  2019-07-16T15:11:49.575Z
26  2019-07-16T15:12:39.563Z
27  2019-02-01T15:07:04.288Z
28  2019-02-02T15:07:04.288Z
29  2019-02-03T15:07:04.288Z
30  2019-02-04T15:07:04.288Z
31  2019-02-05T15:07:04.288Z
32  2019-03-06T15:07:04.288Z
33  2019-03-07T15:07:04.288Z
34  2019-03-08T15:07:04.288Z
35  2019-03-09T15:07:04.288Z
36  2019-03-10T15:07:04.288Z
37  2019-04-11T15:07:04.288Z
38  2019-04-12T15:07:04.288Z
39  2019-04-13T15:07:04.288Z
40  2019-04-14T15:07:04.288Z
41  2019-04-15T15:07:04.288Z
42  2019-05-16T15:07:04.288Z
43  2019-05-17T15:07:04.288Z
44  2019-05-18T15:07:04.288Z
45  2019-05-19T15:07:04.288Z
46  2019-05-20T15:07:04.288Z

如您所见,插入数据库(ID 1-26)的第一个日期在2019-07-152019-07-16之间。以后的日期(ID 27-46)在2019-02-012019-05-20的范围内。

但是,当我运行的查询中包含“小于或等于”时,它仅返回小于数据:

SELECT ID,TimeStamp FROM MyTable WHERE TimeStamp >= '2019-02-03' AND TimeStamp <= '2019-07-15' order by TimeStamp;
SELECT ID,TimeStamp FROM MyTable WHERE TimeStamp >= date('2019-02-03') AND TimeStamp <= date('2019-07-15') order by TimeStamp;
SELECT ID,TimeStamp FROM MyTable WHERE TimeStamp BETWEEN '2019-02-03' AND '2019-07-15' order by TimeStamp;
SELECT ID,TimeStamp FROM MyTable WHERE TimeStamp BETWEEN date('2019-02-03') AND date('2019-07-15') order by TimeStamp;

29  2019-02-03T15:07:04.288Z
30  2019-02-04T15:07:04.288Z
31  2019-02-05T15:07:04.288Z
32  2019-03-06T15:07:04.288Z
33  2019-03-07T15:07:04.288Z
34  2019-03-08T15:07:04.288Z
35  2019-03-09T15:07:04.288Z
36  2019-03-10T15:07:04.288Z
37  2019-04-11T15:07:04.288Z
38  2019-04-12T15:07:04.288Z
39  2019-04-13T15:07:04.288Z
40  2019-04-14T15:07:04.288Z
41  2019-04-15T15:07:04.288Z
42  2019-05-16T15:07:04.288Z
43  2019-05-17T15:07:04.288Z
44  2019-05-18T15:07:04.288Z
45  2019-05-19T15:07:04.288Z
46  2019-05-20T15:07:04.288Z

无论我运行哪个查询,我都不会获得等于2019-07-15的数据,我认为我应该使用“小于或等于”。

为什么这不起作用?

2 个答案:

答案 0 :(得分:2)

自从我使用SQLite以来已经有一段时间了,但是我在这里的假设是这是扔掉查询的时间部分。

just 比较,日期部分(例如'2019-07-15')可能与'2019-07-15T00:00:00.000Z'比较。在这种情况下,所有日期等于'2019-07-05'的行都被排除在外,因为它们的 time 部分将它们排在当天的晚些时候,因此实际上更大即使日期相等。

您可以调整查询以仅检查它是否小于第二天(< '2019-07-16'),或者在当前使用的日期(<= '2019-07-15T23:59:59.999Z')上添加时间方面。

答案 1 :(得分:2)

SQLite将日期值存储为TEXT。
因此,这种情况:

TimeStamp <= '2019-07-15'

TimeStamp'2019-07-15'比较为字符串。
您可以使用

替换它
TimeStamp <= '2019-07-15T23:59:59.999Z'

因此,您可以获取直至(包括)'2019-07-15'的所有日期。
或更简单:

TimeStamp < '2019-07-16'