【问题标题】:Select month and sum for all days in month选择月份并计算月份中所有日期的总和
【发布时间】:2011-04-12 23:38:34
【问题描述】:

我的应用程序有用户将记录输入数据库。这些记录包含一个自动递增的 id、日期(作为 mm-dd-yyyy 格式的文本)、一个数量 (int) 和一些其他字段。

我正在尝试获取所有月份和每个月的总和。这样我就可以在我的应用中显示它们,例如:Dec 2010 - 90qty, Jan 2011 - 45qty...

我现在正在做的是,通过 id 选择日期,升序限制 1 和降序限制 1 以获取数据库中的第一个和最后一个日期。然后我拆分月份和年份并计算其中有多少个月,然后我执行一个 for 循环并填充一个数组,所以我有 12-2010、01-2011、02-2011 ......然后是另一个 for 循环来查询日期在 12-01-2011 和 12-31-2011 之间的 sum(quantity) 数据库等。

我想知道...有没有更好的方法?

【问题讨论】:

  • 理想情况下,SQLite 中的日期应该以ISO8601 格式(YYYY-MM-DD)存储,以便与日期函数一起使用。

标签: java android sqlite


【解决方案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 选择您想要的部分(年份和月份)。如果是DATETIME,你可以这样做:

    SELECT strftime(date, '%m-%Y'), SUM(quantity)
    FROM table GROUP BY strftime(date, '%m-%Y')
    

    【讨论】:

    • SQLite 没有DATE_FORMAT 函数。使用strftime('%m-%Y')
    • @MPelletier 啊谢谢,我更新了答案。出于某种原因,我在考虑 MySQL 并掩盖了 SQLite 标记。
    猜你喜欢
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    相关资源
    最近更新 更多