2010-06-04 219 views
2

因此,我有一张表,用于收集我所做的工作的数据。每次我创建一份工作时,我都会给它分配一个日期。这个问题是我没有工作的日子没有存储在数据库中,因此当我绘制数据时,我从来没有看到我没有工作的日子。通过MySQL从数据库中检索缺失的日期

我当前的查询看起来是这样的:

SELECT job_data_date, SUM(job_data_invoice_amount) as job_data_date_income 
FROM job_data 
WHERE job_data_date >= '2010-05-05' 
GROUP BY job_data_date 
ORDER BY job_data_date; 

输出是:

| job_data_date | job_data_date_income | 
| 2010-05-17  | 125      | 
| 2010-05-18  | 190      | 
| 2010-05-20  | 170      | 

正如你可以从输出示例见​​将不会在结果中显示出来,因为这是从来没有存储在那里。

有没有办法显示缺失的日期?

谢谢

萨芬

+0

*可能的重复,至少与以下相关:* http://stackoverflow.com/questions/2501993/mysql-filling-in-missing-dates,http://stackoverflow.com/questions/2844486/mysql-to-填充缺少日期时使用组按日期表时间戳无,http://stackoverflow.com/questions/400759/sql-group-by-date-but-get-dates-wo-记录 - 也 – 2010-06-04 22:14:30

回答

1

有没有合理的方式做到这一点使用纯SQL,MySQL的,至少,没有用出有史以来每次约会创建表。您最好的选择是改变使用该查询结果的应用程序来填充空洞本身。而不是只绘制它接收到的值,用一个简单的循环构造它自己的一组值;一次计算一天,从查询中填入任何可用的值。

+1

递归查询意味着这样的事情,但MySQL不支持WITH语法:( – 2010-06-04 22:21:12

2

一个想法是,你可以有一个表中的所有日期,你想要显示,然后做一个与该表的外部联接。

所以,如果你有一台名为alldates有一列(job_data_date):

SELECT ad.job_data_date, SUM(job_data_invoice_amount) as job_data_date_income 
FROM alldates ad left outer join job_data jd on ad.job_data_date = jd.job_data_date 
WHERE ad.job_data_date >= '2010-05-05' 
GROUP BY ad.job_data_date 
ORDER BY ad.job_data_date; 

不利的一面是,你需要保持这个表格填充了所有你想要显示的日期。

+0

NUMBERS表更常见 - 只需使用DATE_ADD来根据起点获取日期,但您是对的 - OP需要生成一个日期列表和LEFT JOIN。 – 2010-06-04 22:20:26