在我的数据库中,我将时间戳存储在TIMESTAMP字段中,表结构为:(此时很难将其更改为存储类似unix纪元的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的行)

我尝试将问题缩小为:

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


并发现,如果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')

最佳答案

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'

关于sqlite - 带正斜杠的SQLite SELECT LIKE查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38946421/

10-12 00:37
查看更多