【问题标题】:SQLite SELECT LIKE query with forward slash带正斜杠的 SQLite SELECT LIKE 查询
【发布时间】:2016-08-15 08:05:17
【问题描述】:

在我的数据库中,我将时间戳存储在 TIMESTAMP 字段中,表结构是:(此时很难将其更改为存储类似 unix epoch 的 int)

CREATE TABLE timer (
    [id] INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,
    [topic] VARCHAR(60) NOT NULL,
    [desc] VARCHAR(500)  NULL,
    [project] INTEGER  NOT NULL,
    [start] TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    [end] TIMESTAMP NULL,
    [user] INTEGER  NOT NULL
)

现在我需要选择开始日期在某个月份的行。我以为我可以这样做:

SELECT * FROM timer WHERE start LIKE "%month/%/year%"

但它不起作用。但如果我只是做类似的事情:

SELECT * FROM timer WHERE start LIKE "%8%"

它运行并选择开始日期为 8 月的所有行(以及时间为 8 的行,呵呵)

我尝试将问题缩小到:

SELECT * FROM timer WHERE start LIKE "%/%"

发现如果类似字符串包含正斜杠/,则查询绝对不会返回任何内容。我试图逃避斜线,但这并没有改变任何东西。

为什么当我包含正斜杠时我的查询不起作用?

以下是表格中的一些示例数据:

id  topic     desc        project  start                   end                     user
1    Topic 1   A Desc.     1        8/12/2016 11:34:09 PM   8/12/2016 11:34:15 PM   1
2    Topic 2   A 2ndDesc.  1        8/13/2016 12:55:44 AM   8/13/2016 12:55:49 AM   1

编辑:

根据要求,这是一个 INSERT:

INSERT INTO timer (`topic`, `project`, `desc`, `start`, `end`, `user`) VALUES ('My Topic', '1', 'This is a Desc', '2016-08-15 10:03:41', '2016-08-16 12:03:41', '1')

【问题讨论】:

  • 您能提供一个 INSERT 示例吗?你用的是什么客户端?
  • @cartant 我不明白插入示例如何与问题相关?对于我正在使用 SQLite 管理员sqliteadmin.orbmu2k.de 的客户端:)
  • 这很重要,因为你可以将任何你喜欢的东西塞进 SQLite 的列中,除非你已经编写了自己的触发器来强制执行类型约束。无论如何,我已经回答了这个问题。
  • 我修复了答案中的一堆错误 - 这里是早点和咖啡前。有时使用其他工具查看数据库会很有用。我使用的是SQLiteSpy
  • @cartant 啊我明白了,我在主帖中添加了一个 INSERT,现在我正在查看您的答案

标签: sqlite


【解决方案1】:

SQLite 的TIMESTAMP 类型将日期/时间存储为ISO8601 字符串(SQLite 中有no fundamental TIMESTAMP type),如下所示:

2016-08-14 21:00:42

不包含斜线。当您呈现数据时,数据可能会被重新格式化。

SQLite 不限制数据类型,因此您可能会插入非 ISO8601 字符串。这取决于您的 SQLite 库和您的 INSERT 语句。但是,您的start 列定义为TIMESTAMP DEFAULT CURRENT_TIMESTAMP,因此start 的默认值将是 ISO8601 字符串。如果您的时间格式不一致,您将无法查询数据。

ISO8601 格式是可排序的,因此您要执行的SELECT 可以更高效:

SELECT * FROM timer WHERE start >= :from AND start < :to

请注意,:from:to 中的个位数月份需要用零填充。请注意,:to 中的月份不必是有效月份。这会起作用:

SELECT * FROM timer WHERE start >= '2015-12' AND start < '2015-13'

【讨论】:

  • 感谢您解释 TIMESTAMP 类型,我知道 SQLite 并没有真正的 TIMESTAMP 类型,因为我在任何地方都找不到它的页面,我很好奇它是如何工作的: )
  • 我在 SQLiteSpy 中打开了同一个数据库,果然日期分隔符显示为破折号。我用破折号而不是斜杠重新运行了我的查询,并且按正确的顺序使用了年份和月份,它可以正常工作。感谢 SELECT 示例,它完美运行!我以前不需要在 SQL 数据库中处理太多日期和时间问题,所以这对我来说是一种学习体验 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
相关资源
最近更新 更多