-4

世界上最简单的查询在 SQLite 中不起作用:

SELECT * FROM "events"
  WHERE "date" >= datetime('2021-08-05T22:00:00') AND 
        "date" < datetime('2021-08-12T22:00:00');

表中的日期如下,我只收到最后 2 个:

2021-08-12T16:00:00
2021-09-10T16:00:00
2021-10-12T16:00:00
2021-11-09T17:00:00
2021-12-09T17:00:00
2021-08-12T16:00:00
2021-09-10T16:00:00
2021-10-12T16:00:00
2021-11-09T17:00:00
2021-12-09T17:00:00
2021-08-12T16:00:00
2021-09-10T16:00:00
2021-10-12T16:00:00
2021-11-09T17:00:00
2021-12-09T17:00:00
2021-08-12T16:00:00
2021-09-10T16:00:00
2021-10-12T16:00:00
2021-11-09T17:00:00
2021-12-09T17:00:00
2021-08-12T16:00:00
2021-09-10T16:00:00
2021-10-12T16:00:00
2021-11-09T17:00:00
2021-12-09T17:00:00
2021-08-12T16:00:00
2021-09-10T16:00:00
2021-10-12T16:00:00
2021-11-09T17:00:00
2021-12-09T17:00:00
2021-08-11T16:00:00
2021-08-12 16:00:00

我通过在 SQLiteStudio v3.2.1 中从记事本粘贴简单文本来插入值

4

2 回答 2

1

如果你执行:

datetime('2021-08-05T22:00:00')

结果是:

2021-08-05 22:00:00

你注意到失踪了'T'吗?

因此,您正在比较字符串(在 SQLite 中,日期是字符串)并且比较是按字母顺序进行的,但是在不等式的左侧,您有一个带有 a 的字符串,'T'而在右侧是一个不带 a 的字符串'T'

datetime()在不等式两边使用函数:

WHERE datetime("date") >= datetime('2021-08-05T22:00:00') 
  AND datetime("date") < datetime('2021-08-12T22:00:00')

或者,根本不使用它:

WHERE "date" >= '2021-08-05T22:00:00' 
  AND "date" < '2021-08-12T22:00:00'

请参阅演示

于 2021-08-21T19:31:16.760 回答
-1

我认为它的“设计”。SQLiteStudio 不会费心检查类型。因此,如果您粘贴文本,那么您会在日期字段中获得文本。您必须手动后处理日期:

update "events" set "date" = datetime("date");

编辑澄清。以下语句之前没有产生正确的结果,update并且在之后产生了正确的结果update

SELECT * FROM "events" WHERE "date" >= datetime('2021-08-05T22:00:00') AND "date" < datetime('2021-08-12T22:00:00');
SELECT * FROM "events" WHERE "date" >= datetime('2021-08-05 22:00:00') AND "date" < datetime('2021-08-12 22:00:00');
SELECT * FROM "events" WHERE "date" >= '2021-08-05T22:00:00' AND "date" < '2021-08-12T22:00:00';
SELECT * FROM "events" WHERE "date" >= '2021-08-05 22:00:00' AND "date" < '2021-08-12 22:00:00';
于 2021-08-21T19:31:38.597 回答