解决问题的方法是停止将不符合ISO的日期文字插入SQLite表中。
总是
使用ISO样式的日期,它将正确排序:
create table projects("project_creation_date" text);
insert into projects ("project_creation_date") values ('2019-05-08');
insert into projects ("project_creation_date") values ('2018-12-05');
insert into projects ("project_creation_date") values ('2015-08-06');
insert into projects ("project_creation_date") values ('2020-01-01');
insert into projects ("project_creation_date") values ('2020-03-02');
insert into projects ("project_creation_date") values ('2019-03-02');
请注意,在其他数据库(如Oracle)上,插入语句将完全失败,原始字符串甚至无法被识别为日期文字。这是SQLite的一个怪癖,它实际上没有正式的日期类型,只有日期
密切关系
,日期以文本形式存储。因此,如果你关心排序等事情,使用适当的格式也很重要。
如果你
必须
坚持你当前的设计,那么你将需要一些丑陋的SQL代码来获得你想要的顺序。SQLite没有
strptime
或其他类似的文本到日期函数,因此您在排序时必须按正确的顺序拼凑日期:
SELECT project_creation_date
FROM projects
ORDER BY
SUBSTR(project_creation_date, 7, 4) ||
SUBSTR(project_creation_date, 4, 2) ||
SUBSTR(project_creation_date, 1, 2);
再次,看看你必须做什么才能使当前的数据模型工作,并考虑更改日期格式是否值得。