Android: обычно сохраняет дату в sqlite, но сортирует по дате с учетом месяца и дня - PullRequest
0 голосов
/ 28 февраля 2012

Я видел номер поста о дате хранения.

У меня все еще нет точного и точного подхода к сохранению его в базе данных sqlite.

Я могу сохранить его, но во время сортировки мне нужно учитывать только месяц и день как день рождения, когда годы не имеют значения.

Каким будет запрос, если я хочу получить строку с датой на 2 или 3 дня вперед, например, строкой 2 марта, если поиск производился 28 февраля?

Ответы [ 3 ]

2 голосов
/ 28 февраля 2012

Вы должны начать с проверки документации SQLite по функциям даты и времени .

Например, для решения вашей проблемы " И какой будет запрос, если я хочу получить строку, дата которой на 2 или 3 дня вперед ", вы будете использовать вычисления в юлианский день, например этот пример, который вы можете выполнить непосредственно в оболочке sqlite3:

create TABLE example (_id INTEGER PRIMARY KEY NOT NULL, date TEXT NOT NULL);
insert into example (date) values ('2011-01-02');
insert into example (date) values ('2011-04-02');
insert into example (date) values ('2012-02-26');
insert into example (date) values ('2012-02-27');
insert into example (date) values ('2012-02-28');
insert into example (date) values ('2012-02-29');
insert into example (date) values ('2012-03-01');
insert into example (date) values ('2012-03-02');
insert into example (date) values ('2012-03-03');
select date from example where julianday(date) - julianday('now') < 3 AND julianday(date) - julianday('now') > 0;

Это вернуло бы (учитывая, что «сегодня» 28 февраля) всех дней, которые будут один, два или три дня в будущем:

2012-02-29
2012-03-01
2012-03-02

Редактировать: Чтобы возвращать только строки, независимо от года, вы можете сделать что-то вроде этого - используя VIEW (опять же, exampl прямо в SQLite):

create view v_example as select _id, date,
    strftime("%Y", 'now')||'-'||strftime("%m-%d", date) as v_date from example;

Этот VIEW будет возвращать дату и время в вашей базе данных, «перебазированных» на текущий год, что, конечно, может привести к всевозможным странным действиям со високосными годами.

В этом случае вы можете выбрать все даты, подобные этой:

select date from v_example where 
    julianday(v_date) - julianday('now') < 3 AND
    julianday(v_date) - julianday('now') > 0 ORDER BY v_date;

Что вернет:

2012-02-29
2012-03-01
2001-03-01
2012-03-02
2010-03-02
1 голос
/ 28 февраля 2012

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

Вы можете даже выполнить запрос диапазона со строкой, но вам нужно вычислить строку запроса.

В качестве альтернативы вы можете сохранить дату в виде миллисекунд в дополнительном столбце (это обычный формат для дат в базе данных) и выполнять запросы диапазона легче с целочисленной арифметикой.

0 голосов
/ 28 февраля 2012

Один из вариантов - использовать strftime () в SQLite для вырезки года, а затем выполнить сравнение.

select * from sometable where strftime('%m-%d', somecolumn) = '02-28'

Это сделает запрос всех строк за 28 февраля. Но производительность может ухудшиться, если у вас большая таблица и вам нужно выполнить преобразование строк для каждой строки для сравнения. Может быть, сохранить день и месяц в двух дополнительных столбцах, если этот запрос выполняется часто?

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