Решение вашей проблемы - прекратить вставлять литералы даты, не соответствующие 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, которая на самом деле не имеет формального типа даты, только дату affinity , которые хранятся в виде текста. Следовательно, важно также использовать правильный формат, если вы заботитесь о таких вещах, как сортировка.
Если вы должны придерживаться своего текущего дизайна, вам понадобится какой-то уродливый SQL код чтобы получить желаемый заказ. SQLite не имеет функции strptime
или другой подобной функции text to date, поэтому вам нужно будет собрать дату в правильном порядке при сортировке:
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);
Опять же, посмотрите, что у вас есть сделать, чтобы ваша текущая модель данных работала, и подумайте, стоит ли менять формат даты.