2011-04-12 217 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

相關問題