2011-04-12 120 views
0

我的应用程序让用户将记录输入数据库。记录包含自动递增的ID,日期(以mm-dd-yyyy格式显示的文本),数量(int)以及其他一些字段。选择月份和月份中的所有日期的总和

我试图抓住所有的月份和每月的总金额。以便我可以在我的应用程序中显示它们:2010年12月 - 90qty,2011年1月 - 45qty ...

我现在正在做的是,按ID选择日期,升序限制1和降序限制1以获得数据库中的第一个和最后一个日期。然后我分裂月份和年份,并计算有多少个月在那里,然后我做一个循环,并填写一个数组,所以我有12 - 2010年,01 - 2011年,02 - 2011年...等等,然后另一个循环查询数据库的数量(数量),日期在12-01-2011和12-31-2011之间,等等。

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

+0

理想情况下,在SQLite的日期应被存储在[ISO8601](http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/date_and_time_format.htm)格式(YYYY-MM-DD )以方便与日期功能一起使用。 – MPelletier 2011-04-13 17:46:40

回答

2
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 
1

如果您可以将日期缩小到您希望在数据库中的粒度,那么您可以执行一个查询并遍历结果。这取决于您的data列的字段类型。例如,如果它是VARCHAR,则可以使用SUBSTRING挑选您想要的零件(年和月)。如果它是一个DATETIME,你可以做这样的事情:通过几个月

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

SQLite没有'DATE_FORMAT'功能。使用'strftime('%m-%Y')'。 – MPelletier 2011-04-13 16:37:30

+0

@MPelletier啊谢谢,我更新了答案。我出于某种原因想到了MySQL,并掩盖了SQLite标签。 – WhiteFang34 2011-04-13 17:34:29

相关问题