在我的数据库中,我将时间戳存储在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/