Как выбрать все строки между двумя значениями в SQLite? - PullRequest
0 голосов
/ 23 марта 2020

Я создаю приложение iOS, в котором я хочу получить все значения из моей базы данных между двумя датами, которые выбирает пользователь. Так, например, я хочу, чтобы все строки с 1 марта по 5 марта. Выглядело бы примерно так:

SELECT * FROM MAIN WHERE DATE = '01/03/2020' AND ENDS ='05/03/2020'

Итак, я надеюсь получить все данные с 1-го, 2-го, 3-го, 4-го и 5-го марта. Есть идеи, как это сделать? Спасибо

Ответы [ 3 ]

1 голос
/ 23 марта 2020

Существует две проблемы:

  1. Типы дат:

    Как Типы данных в SQLite версии 3 говорит:

    2.2. Дата и время Тип данных

    SQLite не имеет класса хранения, выделенного для хранения дат и / или времени. Вместо этого встроенные функции даты и времени SQLite могут сохранять даты и время в виде значений TEXT, REAL или INTEGER:

    • TEXT в виде строк ISO8601 («ГГГГ-ММ-ДД ЧЧ: ММ: СС.ССС»).

    • РЕАЛЬНО в виде юлианских чисел, числа дней с полудня в Гринвиче 24 ноября 4714 г. C. согласно prolepti c Григорианский календарь.

    • INTEGER as Unix Время, количество секунд с 1970-01-01 00:00:00 UT C.

    Приложения могут сохранять даты и время в любом из этих форматов и свободно конвертировать между форматами, используя встроенные функции даты и времени .

    Таким образом, сохранение дат в формате dd/MM/yyyy (с использованием соглашения об использовании заглавных букв DateFormatter) проблематично c, потому что при отсутствии собственного типа даты он будет хранить их как строки, и, следовательно, все сравнения будет выполняться в алфавитном порядке, а не в хронологическом порядке, сортируя значения, например 03/10/2009 (или бессмысленные строки, например, 02foobar), между строками 01/05/2020 и 05/05/2020.

    Если, однако, вы храните их как yyyy-MM-dd, тогда просто так получается, что алфавитные сравнения также дадут хронологически правильные сравнения.

  2. SQL синтаксис:

    Если у вас есть даты в вашей базе данных в формате, который сопоставим, тогда, если у вас есть все ваши даты в одном столбце, вы можете использовать синтаксис BETWEEN. Например, предположим, что вы сохранили все свои даты в формате yyyy-MM-dd, тогда вы могли бы сделать что-то вроде:

    SELECT * FROM main WHERE date BETWEEN '2020-03-01' AND '2020-03-05';
    

    Но, разумеется, вы не можете использовать этот шаблон (или любые операторы сравнения кроме равенства), если ваши даты хранятся в формате dd/MM/yyyy.

1 голос
/ 23 марта 2020

Попробуйте использовать операторы сравнения, такие как:

DATE >= '01/03/2020' AND DATE <= '05/03/2020'
0 голосов
/ 23 марта 2020

Если вы хотите показать все данные, которые имеют значения столбца «дата» между этими двумя датами, то:

Select * 
from MAIN
where `date` between '01.03.2020' and '05.03.2020';

Если вы хотите показать все данные, которые имеют значения столбца «заканчивается» тогда между этими двумя датами:

Select * 
from MAIN
where ends between '01.03.2020' and '05.03.2020';

Если вы хотите показать все данные, которые имеют значения столбцов «дата» и «заканчивается» между этими двумя датами, то:

Select * 
from MAIN
where ends between '01.03.2020' and '05.03.2020'
and `date` between '01.03.2020' and '05.03.2020';

Вот демоверсия

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