2010-07-14 58 views
2

我有我做一個SQL語句,這MySQL的:在使用日期條件之間的結果

... group by date having date between '2010-07-01' and '2010-07-10'; 

結果是這樣的:

sum(test)  day 
-------------------- 
20  2010-07-03 
120  2010-07-07 
33  2010-07-09 
42  2010-07-10 

所以我有這些成果,但是有可能,我可以寫一份聲明,讓我每天在「之間」條件下返回這種結果行:

sum(test)  day 
-------------------- 
0   2010-07-01 
0   2010-07-02 
20  2010-07-03 
0   2010-07-04 
0   2010-07-05 
0   2010-07-06 
120  2010-07-07 
...  ... 
42  2010-07-10 

否則,如果這是不可能的,我必須在我的程序邏輯中執行它。

非常感謝&最好的問候。

更新:也許它會更好,如果我將向你展示完整的SQL語句:

select COALESCE(sum(DUR), 0) AS "r", 0 AS "opt", DATE_FORMAT(date, '%d.%m.%Y') AS "day" from (
    select a.id as ID, a.dur as DUR, DATE(FROM_UNIXTIME(REVTSTMP/1000)) as date, 
     a_au.re as RE, a_au.stat as STAT from b_c 
     join c on b_c.c_id = c.id 
     join a on c.id = a.c_id 
     join a_au on a.id = a_au.id 
     join revi on a_au.re = revi.re 
     join (
      select a.id as ID, DATE(FROM_UNIXTIME(REVTSTMP/1000)) as date, 
      max(a_au.re) as MAX_RE from b_c 
       join c on b_c.c_id = c.id 
       join a on c.id = a.c_id 
       join a_au on a.id = a_au.id 
       join revi on a_au.re = revi.re 
       where b_c.b_id = 30 group by ID, date) x on 
       x.id = a.id and x.date = date and x.MAX_RE = a_au.rev 
       where a_au.stat != 7 
      group by ID, x.date) 
     AS SubSelTable where date between '2010-07-01' and '2010-07-15' group by date; 

更新: 我的新的SQL語句( - >戴夫裏克斯):

select coalesce(`theData`.`real`, 0) as 'real', 0 as 'opt', DATE_FORMAT(`DT`.`ddDate`, '%d.%m.%Y') as 'date' 
    from `dimdates` as DT 
    left join (
     select coalesce(sum(DUR), 0) AS 'real', 0 AS 'opt', date 
      from (
       select a.id as ID, a.dur as DUR, DATE(FROM_UNIXTIME(REVTSTMP/1000)) as date, a_au.RE as RE, a_au.stat as STAT 
        from b_c 
         join c on b_c.c_id = c.id 
         join a on c.id = a.c_id 
         join a_au on a.id = a_au.id 
         join revi on a_au.RE = revi.RE 
         join ( 
          select a.id as ID, DATE(FROM_UNIXTIME(REVTSTMP/1000)) as date, max(a_au.RE) as MAX_RE 
           from b_c 
           join c on b_c.c_id = c.id 
           join a on c.id = a.c_id 
           join a_au on a.id = a_au.id 
           join revi on a_au.RE = revi.RE 
          where b_c.b_id = 30 GROUP BY ID, date 
         ) x 
        on x.id = a.id and x.date = date and x.MAX_RE = a_au.RE 
        where a_au.stat != 20 
        group by ID, x.date 
      ) AS SubTable 
     where date between '2010-07-01' and '2010-07-10' group by date) AS theData 
    ON `DT`.`ddDate` = `theData`.`date` where `DT`.`ddDate` between '2010-07-01' and '2010-07-15'; 
+0

是什麼日子列的數據類型 - 字符串或日期/ DATETIME/TIMESTAMP? – 2010-07-14 19:59:01

+0

date是從毫秒級的UNIX-TIMESTAMP到DATE的轉換。 – Tim 2010-07-14 21:01:37

回答

1

看看我的回答以下問題;

Select all months within given date span, including the ones with 0 values

這可能正是你正在尋找:)

您可以通過修改上面的查詢如下(你可以整合這一點,但這種方式比較簡單!);

​​3210

,你還需要在查詢中改變DATE_FORMAT(date, '%d.%m.%Y') AS "day"只是date 例如

select COALESCE(sum(DUR), 0) AS "r", 0 AS "opt", `date` from 

至於@OMG小馬的回答,您將需要用大量的數據行的預填充dateTable

有誰知道我可以如何發佈我的這個表的SQL轉儲作爲可附加文件?這是相當大的,但可以是有用的...

+0

因此,我應該創建一個新的表MYDATE與DATE類型的一列? 然後做一個左連接嗎?好的...這可以與我給定的SQL語句集成(請參閱我的更新的第一篇文章)? – Tim 2010-07-14 21:41:39

+0

更新了我的答案,以包含Tim提問的答案!基本上你可以做一個字段表,但我的鏈接例子提供了更多的長期靈活性 – 2010-07-14 22:47:43

+0

非常感謝。嗯,我想你不能在這裏上傳文件。你必須選擇像rapidshare這樣的文件共享服務,我沒有網站空間。 噢,但在2012年實施(?)我會在2月29日遇到問題:-) – Tim 2010-07-14 23:08:07

1

把之間的邏輯放在哪裏從句

Select Sum(day), day 
From Table 
Where day Between date1 and date2 
Group By day 

編輯: 已經只能用在聚集過濾數據...即

Having Sum(day) > 10 
+0

但是用這個SQL語句我沒有得到期望的結果?! 但我改變這一點,非常感謝這個提示。 – Tim 2010-07-14 21:09:51

+0

我用我的完整SQL語句更新了我的第一篇文章。 – Tim 2010-07-14 21:18:41

1

假設您的日期列是一個DATETIME列,您需要使用的東西來更改時間值是相同的正確的分組發生。 IE:

SELECT SUM(t.test), 
     DATE_FORMAT(t.date, '%Y-%m-%d') AS day 
    FROM TABLE t 
    WHERE t.date BETWEEN @start AND @end 
GROUP BY DATE_FORMAT(t.date, '%Y-%m-%d') 

但是,如果給定日期沒有記錄,則日期不會出現在結果集中。換句話說,輸出中不會顯示帶零的日期。

爲了解決這個問題,您需要將LEFT JOIN添加到MySQL的日期表中,而MySQL無法生成這些日期。它甚至不能產生號碼的列表,所以你必須創建一個表與單個列:

DROP TABLE IF EXISTS `example`.`numbers`; 
CREATE TABLE `example`.`numbers` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

...並填充它:之前你可以

INSERT INTO numbers (id) VALUES (NULL) 

...用數值來生成使用日期的列表中DATE_ADD function

SELECT COALESCE(SUM(t.test), 0), 
     x.the_date AS day 
    FROM (SELECT DATE_FORMAT(DATE_ADD(NOW(), INTERVAL n.id-1 DAY), '%Y-%m-%d') AS the_date 
      FROM NUMBERS n) x 
LEFT JOIN your_table yt ON DATE_FORMAT(yt.date, '%Y-%m-%d') = x.the_date 
    WHERE x.the_date BETWEEN @start AND @end 
GROUP BY x.the_date 
+0

非常感謝,我在第一篇文章中發佈了完整的SQL語句。 – Tim 2010-07-14 21:28:15

+0

如何使用@start和@end?我應該用'2010-07-01'和'2010-07-10'來替代它嗎? – Tim 2010-07-14 21:34:54

+0

@Tim:是的,那是你想要提供任何值的佔位符。 – 2010-07-14 21:45:21

相關問題