2010-07-14 49 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

相关问题