#java #android #sqlite
#java #Android #sqlite
Вопрос:
В моем приложении пользователи вводят записи в базу данных. Записи содержат автоматически увеличивающийся идентификатор, дату (в виде текста в формате мм-дд-гггг), количество (int) и несколько других полей.
Я пытаюсь получить все месяцы и сумму за каждый месяц. Чтобы я мог отображать их в своем приложении, например: декабрь 2010 — 90кв.м., январь 2011 — 45кв.м….
Что я делаю сейчас, так это выбираю дату по идентификатору, возрастающему пределу 1 и убывающему пределу 1, чтобы получить первую и последнюю даты в базе данных. Затем я разделяю месяцы и год и вычисляю, сколько там месяцев, затем я выполняю цикл for и заполняю массив, так что у меня есть 12-2010, 01-2011, 02-2011 … и т.д. затем еще один цикл for для запроса к базе данных суммы (количества), где дата находится между 12-01-2011 и 12-31-2011 и т.д.
Мне интересно… есть ли способ лучше?
Комментарии:
1. В идеале даты в SQLite должны храниться в формате ISO8601 (ГГГГ-ММ-ДД) для удобства использования с функциями даты.
Ответ №1:
CREATE TABLE test (
id integer primary key, date date, quantity integer);
INSERT INTO "test" VALUES(1,'2011-01-01',5);
INSERT INTO "test" VALUES(2,'2011-02-01',13);
INSERT INTO "test" VALUES(3,'2011-02-12',14);
INSERT INTO "test" VALUES(4,'2011-03-01',133);
Вы можете сгруппировать по месяцам и суммировать величины следующим образом.
select strftime('%Y-%m', date), sum(quantity)
from test
group by strftime('%Y-%m', date);
2011-01 5
2011-02 27
2011-03 133
Ответ №2:
Если вы можете сузить дату до желаемой степени детализации в базе данных, то вы можете выполнить это одним запросом и повторить результаты. Это зависит от того, к какому типу поля относится ваш data
столбец. VARCHAR
Например, вы можете использовать SUBSTRING
, чтобы выбрать нужные части (год и месяц), если это a. Если это DATETIME
, вы можете сделать что-то вроде этого:
SELECT strftime(date, '%m-%Y'), SUM(quantity)
FROM table GROUP BY strftime(date, '%m-%Y')
Комментарии:
1. В SQLite нет
DATE_FORMAT
функции. Используйтеstrftime('%m-%Y')
.2. @MPelletier ах, спасибо, я обновил ответ. По какой-то причине я думал о MySQL и замалчивал тег SQLite.