【问题标题】:Select all records in a date range even if no records present选择日期范围内的所有记录,即使没有记录存在
【发布时间】:2017-05-25 22:35:23
【问题描述】:

我有一个员工数据库及其出勤率。我必须创建出勤日期范围报告。

考勤数据库表

我正在使用下面的查询

SELECT a.* FROM attendance a WHERE a.user_id=10 AND (a.date BETWEEN '2017-01-06' AND '2017-01-10')

结果:-

我还想要所有给定日期范围的记录,但数据库中不存在某些日期记录,我希望日期显示空值以对应于该日期,如下图所示。

【问题讨论】:

  • 我认为还有其他问题,因为查询没有错,它只是过滤了日期和 user_id,这两种情况都是正确的。您可以尝试删除a. 并进行正常查询吗? (SELECT * FROM 出勤 WHERE user_id=10 AND(date BETWEEN '2017-01-06' AND '2017-01-10')
  • 通常会处理应用程序代码中的数据显示问题(例如缺少行)
  • @Tosfera 在数据库中,我们没有该日期 (07,08) 的记录,但我希望得到响应,包括我在上图中显示的所提供间隔的缺失日期。
  • @Strawberry 我可以编写应用程序代码来处理这种情况。如果我们得到我们想要的响应而不是编写代码会更好。
  • 所以最终,您将其输出到命令行窗口? :-(

标签: mysql date


【解决方案1】:

试试这个。我无法运行它,但我的想法是根据此answer 生成日期范围。

  1. 将此日期范围用作派生表d

  2. 做一个dleft joinattendance添加你的条件,这样你就会得到所有匹配数据的列和null不匹配的数据。

  3. 这将为您提供除员工 ID 之外的其余数据。我建议您可以在选择查询中对其进行硬编码。

    select * from 
        (select a.Date 
            from 
            (
                select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
                from (select 0 as a 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) as a
                cross join (select 0 as a 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) as b
                cross join (select 0 as a 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) as c
            ) a
            where a.Date between '2017-01-06' AND '2017-01-10' 
        ) d
    left join 
        attendance a
    on d.date = a.date
    where 
    a.user_id=10
    

【讨论】:

  • 我在数据库中执行了这行不通...我已经用谷歌搜索了它并访问了我找到的所有解决方案,但没有一个对我有用..
  • 为什么这不起作用?你会得到任何错误吗?如果您使用 sqlfiddle.com 并创建示例表以便尝试运行查询,会更容易。
猜你喜欢
  • 2010-11-06
  • 2018-06-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多