Даты в sqlite

У меня есть база данных в SQLite3, в которой я хочу отображать информацию в соответствии с самой последней датой (DESC).

Итак, это мой SQL:

CREATE TABLE IF NOT EXISTS news(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    userid INTEGER,
    title TEXT NOT NULL,
    photo TEXT NOT NULL,
    datePosted INTEGER,
    article TEXT NOT NULL,  
    FOREIGN KEY(userid) REFERENCES users(id)
);

Я думал, что вы должны использовать тип DATE для даты, но вы также можете использовать INTEGER и TEXT... Что мне использовать? Я просто хочу вставить дату в этом формате вручную: 'dd/mm/yyy', а затем отсортировать по датам, строго по дням, месяцам и годам.

Запросы:

INSERT INTO news(userid, title, photo, datePosted, article)
 VALUES(1, "a string", "a string", "30/11/2020", "a string");
INSERT INTO news(userid, title, photo, datePosted, article)
 VALUES(2, "a string", "a string", "07/11/2020", "a string");
INSERT INTO news(userid, title, photo, datePosted, article)
 VALUES(1, "a string", "a string", "09/12/2020", "a string");
INSERT INTO news(userid, title, photo, datePosted, article)
 VALUES(2, "a string", "a string", "01/12/2020", "a string");
INSERT INTO news(userid, title, photo, datePosted, article)
 VALUES(1, "a string", "a string", "05/12/2020", "a string");

Я пробовал это:

SELECT * FROM news 
ORDER BY news.datePosted DESC;

person Daniel    schedule 05.12.2020    source источник


Ответы (1)


В SQLite нет типа данных Date.
Вы можете найти все о типах данных SQLite здесь: Типы данных в SQLite Версия 3.

Вы можете сохранить дату в виде INTEGER (отметка времени в формате Unix), REAL чисел (номер дня по юлианскому календарю) или TEXT.

Если вы выберете INTEGER или REAL, даты будут сопоставимы, и все, что вам нужно, это функции даты и времени SQLite чтобы преобразовать их в удобочитаемый формат.

Если вы выберете тип данных TEXT, используйте формат YYYY-MM-DD, который является единственным допустимым текстовым форматом даты для SQLite, потому что любой другой формат несопоставим, и вы должны использовать строковые функции, чтобы сделать его сопоставимым или переформатировать его, если это необходимо.

В вашем случае, если вы храните даты в формате DD/MM/YYYY, вы не сможете сортировать даты напрямую, потому что сортировка является алфавитной для столбца TEXT, поэтому вам нужно будет переставить с помощью строковых функций 3 части даты в получить сопоставимый формат YYYY-MM-DD, а затем применить сортировку.

person forpas    schedule 05.12.2020
comment
Я пробовал использовать оба формата для целых чисел, и это работает, но первая строка (30.11.2020) считается самой последней, а не только днем, но не месяцем. Хз почему... - person Daniel; 05.12.2020
comment
@DanielCalota Не работает в формате дд/мм/гггг, потому что сравнение производится по алфавиту. Это то, что я упоминаю в своем ответе. Строка 30/11/2020 считается большей, чем 09/12/2020. - person forpas; 05.12.2020
comment
Я имею в виду, что я изменил все строки в этом формате дд-мм-гггг - person Daniel; 05.12.2020
comment
@DanielCalota вы должны изменить формат на ГГГГ-ММ-ДД. - person forpas; 05.12.2020
comment
Вы на мой вопрос набрали 100к, не так ли? :)) - person Daniel; 05.12.2020
comment
Не совсем, еще нет... - person forpas; 05.12.2020