【问题标题】:SQLite DateTime query - why it doesnt work?SQLite DateTime 查询 - 为什么它不起作用?
【发布时间】:2021-09-08 16:00:11
【问题描述】:

我的 SQLite DB 中有下表:

CREATE TABLE [TICK] (                               
TS          DATETIME        NOT NULL,
PRICE       DECIMAL(10,3)   NOT NULL
);

我试图过滤掉给定的日期和时间范围 - 例如:

SELECT * FROM TICK t  WHERE ts between   '2017-01-25 21:44:13'  AND '2017-03-21 16:35:14'

但这会返回 ts=2017-01-26 08:00:00 的第一条记录,而预计会出现“2017-01-25 21:45:12”

我可以通过将 ts 转换为 DateTime 来改进它:

SELECT * FROM TICK t  WHERE datetime( ts) between   '2017-01-25 21:44:13'  AND '2017-03-21 16:35:14'

但我不明白为什么我需要这样做(如果 TS 列已经是 DateTime 类型)?

这种查询的性能也比第一个慢 10 倍

请告知如何处理 Sqlite 中的时间戳...(我在其他数据库引擎中没有此类问题)

示例数据:

TS                  |PRICE   |
--------------------+--------+
2017-01-30  08:00:00|2293.598|
2017-01-30  08:01:00| 2287.14|
2017-01-30  08:02:00|2287.194|
2017-01-30  08:03:00|2287.335|
2017-01-30  08:04:00| 2287.23|
2017-01-30  08:05:00|2287.078|
2017-01-30  08:06:00|2287.156|
2017-01-30  08:07:00|2287.063|
2017-01-30  08:08:00|2286.782|

【问题讨论】:

  • SQLite 中没有 DATETIME 数据类型:sqlite.org/datatype3.html
  • 发布您的表的示例数据。
  • @forpas - 为什么我可以在 DDL 中使用它以及为什么在我进行投射时它会起作用
  • 您可以使用 anything 作为数据类型。试试CREATE TABLE t(x anything)。它在 SQLite 中工作。阅读我之前评论链接中的文档。另请阅读:sqlite.org/lang_datefunc.html
  • TS 列的日期和时间之间真的有 2 个空格吗?如果是这样,请将其更改为正好 1 个空格。

标签: sql sqlite


【解决方案1】:

为他人的利益总结一下

我了解到:

  • SQLlite 并没有真正的 DateTime 类型
  • 但 DDL 允许创建此类字段类型
  • 我忽略了日期和时间之间有 2 个空格 - 导致问题的原因
  • 由于 Sqlite 没有这样的类型,你不能指望它会控制你在这样的字段中输入的内容

所有功劳归@forpas

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多