通过 MySQL 从数据库中检索丢失的日期
Posted
技术标签:
【中文标题】通过 MySQL 从数据库中检索丢失的日期【英文标题】:Retrieve missing dates from database via MySQL 【发布时间】:2010-06-04 22:10:52 【问题描述】:所以我有一张表格,用于收集我所做工作的数据。每次创建工作时,我都会为其分配一个日期。问题是我没有工作的日子没有存储在数据库中,因此当我绘制我的数据时,我从来没有看到我有零工作的日子。
我当前的查询如下所示:
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 |
从示例输出中可以看出,2010-05-19
不会出现在结果中,因为它从未存储在那里。
有没有办法显示缺少的日期?
谢谢,
马拉
【问题讨论】:
可能重复,至少相关: ***.com/questions/2501993/…, ***.com/questions/2844486/…, ***.com/questions/400759/… 【参考方案1】:一个想法是,您可以有一个表,其中包含您要显示的所有日期,然后与该表进行外部联接。
因此,如果您有一个名为 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;
不利的一面是,您需要在此表中保留要显示的所有日期。
【讨论】:
一个 NUMBERS 表更常见 - 只需使用 DATE_ADD 根据起点获取您的日期。但你是对的 - OP 需要生成一个日期列表并针对它进行 LEFT JOIN。【参考方案2】:至少在 mysql 上,使用纯 SQL 来做到这一点是没有合理的方法的,而无需创建一个包含每个设计日期的表。您最好的选择是更改使用该查询结果的应用程序来填补漏洞本身。与其只绘制它接收到的值,不如用一个简单的循环构造它自己的一组值;一次计数一天,在任何可用的地方填写查询中的值。
【讨论】:
递归查询适用于这样的事情,但 MySQL 不支持 WITH 语法 :(以上是关于通过 MySQL 从数据库中检索丢失的日期的主要内容,如果未能解决你的问题,请参考以下文章
如何在 laravel php 中使用 ajax 根据日期范围从 mysql 数据库中检索数据?