2010-01-11 89 views
1

我正在使用SQLite。SQLite查詢加入一系列日期?

假設我有一個表sales,有兩欄,datecount,用來跟蹤我當天銷售多少杯檸檬水。如果我不在特定的日子賣任何檸檬水,我很沮喪,不能在sales表中創建一個新的行。

我想知道給定日期範圍內平均銷售的眼鏡數量。我可以發出如下查詢:

SELECT AVG(count) FROM sales WHERE date IS BETWEEN '2010-01-04' AND '2010-01-10'; 

但是,除非該範圍內的所有日期都包含在表中,否則結果將不準確。我需要一些方法告訴SQLite將丟失的行數作爲零。

我想如果我可以加入日期範圍內的銷售表,那將是理想的。這看起來不太可能,所以從日期範圍創建表的簡單方法可能是下一個最好的事情。我不想修改銷售表,這對於檸檬水攤來說顯得很愚蠢,但是在現實生活中卻更有意義。

正如我上面所說的,我使用的是SQLite,所以如果您向我推薦其他數據庫,那麼您將不會很有幫助。也就是說,如果你對另一個數據庫有更多的經驗,並且認爲你的解決方案可以在vanilla SQL中完成,我很樂意聽到它。

+0

你可以說什麼關於範圍?它應該是任意長度嗎?或者有最大值? – 2010-01-11 21:31:08

回答

5

創建日曆表,並加入到認爲:

像這樣的東西會做:

create table dates (id integer primary key); 
insert into dates default values; 
insert into dates default values; 
insert into dates select null from dates d1, dates d2, dates d3 , dates d4; 
insert into dates select null from dates d1, dates d2, dates d3 , dates d4; 
alter table dates add date datetime; 
update dates set date=date('2000-01-01',(-1+id)||' day'); 

,將覆蓋你,直到2287年5月20日 在添加一個索引日期列日期表不會受到傷害。我的sqlite很少生鏽,所以我建議你參考the manual

編輯:代碼爲索引:

create unique index ux_dates_date on dates (date); 
+0

這適用於sqlite。聰明的黑客。 – benzado 2010-01-12 00:09:41

3

我想你需要的東西是這樣的:

SELECT sum(count)/((strftime('%s','2010-01-10')-strftime('%s','2010-01-04')+86400)/86400) 
FROM sales 
WHERE date IS BETWEEN '2010-01-04' AND '2010-01-10'; 

查詢通過採取給定之間的秒數計算天的確切數目日期
併除以86400(= 24 * 3600)秒。

例如

SELECT (strftime('%s','2010-03-01')-strftime('%s','2010-01-01') + 86400)/86400 

輸出60這是正確的值。

退房的SQLite的Date And Time Functions.

+0

聰明!我想到的東西太複雜了。 – 2010-01-11 22:27:36

+0

這很好,但它只適用於計算平均值。如果這還不夠,我還想做一些更復雜的事情。 – benzado 2010-01-12 00:08:59

1

你可以使用遞歸公用表表達式生成一系列的時間,並加入到它:

WITH RECURSIVE 
    cnt(x) AS (
    SELECT 0 
    UNION ALL 
    SELECT x+1 FROM cnt 
    LIMIT (SELECT ((julianday('2010-01-10') - julianday('2010-01-04'))) + 1) 
), 
WITH date_series AS (
    SELECT date(julianday('2010-01-04'), '+' || x || ' days') as date 
FROM date_series ds 
) 
SELECT AVG(COALESCE(s.count, 0)) as avg_sales_count 
FROM date_series ds 
    LEFT JOIN sales s ON ds.date = s.date 

我寫了一個博客帖子有更多的信息在這裏:http://www.geekytidbits.com/generate-date-range-sqlite/