【问题标题】:Can't get all dates of a month in mysql无法在mysql中获取一个月的所有日期
【发布时间】:2014-06-04 10:04:12
【问题描述】:

我想制作一个程序来显示员工在一个月内的出勤情况。如果只显示员工在场的日期,我可以做到这一点,但我想显示员工不出席(缺席)的日期。 我有这样的 MySQL 查询

SELECT x.Tanggal
        , TIME(a.EventTime) AS TimeIn
FROM
(SELECT  Tanggal FROM (
SELECT DATE_ADD('2014-05-01', INTERVAL n5.num*10000+n4.num*1000+n3.num*100+n2.num*10+n1.num DAY ) AS Tanggal FROM
(SELECT 0 AS num
   UNION ALL SELECT 1
   UNION ALL SELECT 2
   UNION ALL SELECT 3
   UNION ALL SELECT 4
   UNION ALL SELECT 5
   UNION ALL SELECT 6
   UNION ALL SELECT 7
   UNION ALL SELECT 8
   UNION ALL SELECT 9) n1,
(SELECT 0 AS num
   UNION ALL SELECT 1
   UNION ALL SELECT 2
   UNION ALL SELECT 3
   UNION ALL SELECT 4
   UNION ALL SELECT 5
   UNION ALL SELECT 6
   UNION ALL SELECT 7
   UNION ALL SELECT 8
   UNION ALL SELECT 9) n2,
(SELECT 0 AS num
   UNION ALL SELECT 1
   UNION ALL SELECT 2
   UNION ALL SELECT 3
   UNION ALL SELECT 4
   UNION ALL SELECT 5
   UNION ALL SELECT 6
   UNION ALL SELECT 7
   UNION ALL SELECT 8
   UNION ALL SELECT 9) n3,
(SELECT 0 AS num
   UNION ALL SELECT 1
   UNION ALL SELECT 2
   UNION ALL SELECT 3
   UNION ALL SELECT 4
   UNION ALL SELECT 5
   UNION ALL SELECT 6
   UNION ALL SELECT 7
   UNION ALL SELECT 8
   UNION ALL SELECT 9) n4,
(SELECT 0 AS num
   UNION ALL SELECT 1
   UNION ALL SELECT 2
   UNION ALL SELECT 3
   UNION ALL SELECT 4
   UNION ALL SELECT 5
   UNION ALL SELECT 6
   UNION ALL SELECT 7
   UNION ALL SELECT 8
   UNION ALL SELECT 9) n5
) a
WHERE (Tanggal BETWEEN '2014-05-01' AND '2014-05-31')) x
LEFT JOIN VW_AttendanceIN a ON DATE(a.EventTime)=x.Tanggal
WHERE a.EmployeeID='90443'
AND (DATE(a.EventTime) BETWEEN '2014-05-01' AND '2014-05-31')
GROUP BY x.Tanggal

但是,结果只是像这样给出现在的日期

结果:

|   Tanggal  |  TimeIn  |
| 2014-05-01 | 08:00:00 |
| 2014-05-02 | 08:00:00 |
| 2014-05-05 | 08:00:00 |
| 2014-05-06 | 08:00:00 |
| 2014-05-07 | 08:00:00 |

第 3 和第 4 未列出 我想要这样的结果

|   Tanggal  |  TimeIn  |
| 2014-05-01 | 08:00:00 |
| 2014-05-02 | 08:00:00 |
| 2014-05-03 |   NULL   |
| 2014-05-04 |   NULL   |
| 2014-05-05 | 08:00:00 |
| 2014-05-06 | 08:00:00 |
| 2014-05-07 | 08:00:00 |

谁能帮我解决这个问题?

【问题讨论】:

  • AND (DATE(a.EventTime) BETWEEN '2014-05-01' AND '2014-05-31') where 使它成为一个内部连接,并可能将其移动到连接子句。
  • @AbhikChakraborty 如果我删除该子句,它会给出相同的结果
  • 能否请您提供表结构和一些数据,我认为它类似于我之前回答的stackoverflow.com/questions/23300303/…。

标签: mysql sql database stored-procedures


【解决方案1】:

解决方案

你需要替换这个:

LEFT JOIN VW_AttendanceIN a ON DATE(a.EventTime)=x.Tanggal
WHERE a.EmployeeID='90443'
AND (DATE(a.EventTime) BETWEEN '2014-05-01' AND '2014-05-31')

以下内容:

LEFT JOIN VW_AttendanceIN a ON DATE(a.EventTime)=x.Tanggal AND a.EmployeeID='90443'

原因

在WHERE 子句中对连接表的引用会过滤掉最终结果集的行,而不是连接表中的匹配行,即它不允许a.EmployeeID 或a.EventTime 成为NULL。如果将这些引用放在LEFT JOIN 的ON 子句中则不是这种情况,因为它会从连接表中过滤掉不匹配的行,而不是从最终结果集中。

【讨论】:

  • 它解决了我的问题,但我有一个问题。为什么我之前的查询没有给出相同的结果?哪一个是问题?
  • 非常感谢您的解释,它给了我更多的经验
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多