Упорядочить по дате в SQLite3 - PullRequest
0 голосов
/ 04 августа 2020

Я делаю простую таблицу в SQLite, которую хочу упорядочить по убыванию даты. Вот SQL, который я бегу, чтобы сгенерировать таблицу:

create table projects("project_creation_date" text);
insert into projects ("project_creation_date") values ("08/05/2019");
insert into projects ("project_creation_date") values ("05/12/2018");
insert into projects ("project_creation_date") values ("06/08/2015");
insert into projects ("project_creation_date") values ("01/01/2020");
insert into projects ("project_creation_date") values ("02/03/2020");
insert into projects ("project_creation_date") values ("02/03/2019");

Вот мой оператор выбора:

select "project_creation_date" from projects order by strftime("project_creation_date", '%d/%m/%Y') desc;

Это все еще неправильно упорядочивает мои даты:

08/05/2019
05/12/2018
06/08/2015
01/01/2020
02/03/2020
02/03/2019

Что я здесь не так делаю?

1 Ответ

2 голосов
/ 04 августа 2020

Решение вашей проблемы - прекратить вставлять литералы даты, не соответствующие 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);

Опять же, посмотрите, что у вас есть сделать, чтобы ваша текущая модель данных работала, и подумайте, стоит ли менять формат даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...