通过 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 数据库中检索数据?

如何使用 jdatechooser 从 mysql 数据库中保存和检索空日期

检索 MySQL 日期时,它变为日期和时间

以 html 形式从 MYSQL 中检索日期

MySQL 按日期和计数分组,包括丢失的日期

使用 VB.NET 表单从 SQL Server 到 Excel 的日期数据检索