首页 > 解决方案 > 为什么我的 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-15to期间2019-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,我认为我应该使用“小于或等于”。

为什么这不起作用?

标签: sqlite

解决方案


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

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

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


推荐阅读