使用正斜杠

时间:2016-08-14 20:40:44

标签: sqlite

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

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'