0

我正在尝试在两个日期范围之间选择数据。但是,并非每天都会插入所有数据。以下是表格样本:

mysql> SELECT * FROM attendance;
+------------+-------+
| date       | total |
+------------+-------+
| 2012-07-02 |   100 |
| 2012-07-04 |    70 |
| 2012-07-05 |    78 |
+------------+-------+
3 rows in set (0.00 sec)

场景是我想从 2012-07-02 到 2012-07-04 获得总出勤率。根据上面的数据我会得到

mysql> SELECT * FROM attendance WHERE date BETWEEN '2012-07-02' AND '2012-07-04';
+------------+-------+
| date       | total |
+------------+-------+
| 2012-07-02 |   100 |
| 2012-07-04 |    70 |
+------------+-------+
2 rows in set (0.00 sec)

但是我的目标是让 2012-07-03 包含在结果中。

+------------+-------+
| date       | total |
+------------+-------+
| 2012-07-02 |   100 |
| 2012-07-03 |     0 |
| 2012-07-04 |    70 |
+------------+-------+

这可以通过MySQL来完成吗?我确实查看了临时表。但仍然无法达到目的。

4

3 回答 3

1

您可以将日期枚举为派生的伪表(使用UNION),然后将其与您的数据连接起来

SELECT dates.date, COALESCE(attendance.total,0) AS total FROM (
SELECT '2012-07-02' AS date
UNION ALL SELECT '2012-07-03'
UNION ALL SELECT '2012-07-04'
) AS dates
LEFT JOIN attendance USING(date)

编辑:添加COALESCE以返回0而不是NULL丢失记录。

于 2012-07-05T05:35:34.803 回答
0

MySQL 无法生成不存在的数据。如果您想要不存在的日期,则需要一个包含您加入的完整日期范围的临时表。另一种选择是维护一个服务器端变量并为每一行做一些日期数学,这很难看

select @dateval := '2012-07-02';
SELECT @dateval := @dateval + INTERVAL 1 DAY from ...
于 2012-07-05T04:40:19.337 回答
0

这是一个简单解决方案的常见问题。

创建一个常规表,例如 REF_DATE,并将所有日期存储在其中,例如 3 年或您需要的任何时间跨度。

然后使用左边的这个表LEFT OUTER JOIN

SELECT REF.date,IFNULL(A.total,0) as total FROM REF_DATE REF 
LEFT OUTER JOIN attendance 
ON REF.date=A.date
A WHERE REF.date BETWEEN '2012-07-02' AND '2012-07-04';

DATE 是 MySQL 中的一个关键字,我在这里使用它是为了便于阅读。使用不同的列名。

于 2012-07-05T05:59:13.540 回答