Sqlite之间的日期

时间:2017-08-31 11:22:19

标签: sqlite date

你可以帮我解释为什么这段代码不起作用? 我不明白为什么结果包括“2017”。

SQLLITE

QUERY

SELECT issue_date as count FROM tablename where issue_date >= "08/08/2016" and issue_date < "09/01/2016"

结果

“2017年8月8日”

“2017年8月11日”

“2017年8月18日”

“2017年8月18日”

“2017年8月22日”

“2017年8月22日”

“2017年8月28日”

“2017年8月31日”

创建查询

CREATE TABLE tablename(     issue_date datetime text not null }

插入查询

INSERT INTO tablename(issue_date)值(“08/31/2017”);

3 个答案:

答案 0 :(得分:1)

您以非ANSI兼容格式存储日期。由于SQLite中没有正式的日期类型,并且所有日期基本上都存储为字符串,因此您当前的日期比较将表现和排序,就像您要与文本进行比较一样。它不起作用,因为你先是月份,然后是白天,然后是年份。要使日期的文本比较正常工作,请使用以下格式:

yyyy-mm-dd

您应该更改用于存储日期的格式,但是一种解决方法是以正确的格式构建发布日期,然后进行比较,也使用相同格式的日期字符串进行比较:

SELECT
    issue_date AS count
FROM tablename
WHERE
    SUBSTR(issue_date, 7, 4) || '-' ||
    SUBSTR(issue_date, 1, 2) || '-' ||
    SUBSTR(issue_date, 4, 2) BETWEEN '2016-08-08' AND '2016-09-01'

答案 1 :(得分:0)

SQLite的data types没有真正的DATETIME类型。它只有NULL,INTEGER,REAL,TEXT和BLOB。任何其他类型都转换为这些类型,因此它在您的情况下正在做的是将这些值存储为字符串,并将其作为字符串进行比较。

我个人更喜欢将日期存储为UNIX时间戳(因此是整数),以避免使SQL查询复杂化并简化整个过程(尽管数据库中的值将变得不那么易读)。

答案 2 :(得分:-1)

因为您使用AND指定了查询。所以它匹配您的查询。使用BETWEEN表达式。

expression BETWEEN value1 AND value2;