在我的数据库中,我将时间戳存储在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月份开始日期的所有行(以及时间段为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')
答案 0 :(得分: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'