【问题标题】:query select having duplicate data between daterange查询选择在日期范围之间有重复数据
【发布时间】:2018-04-23 08:39:24
【问题描述】:

我有桌子

id  | id_employee    |  start_date  | enddate
--------------------------------------------- 
1   |    A           |   01/04/2018 | 05/04/2018
2   |    B           |   03/04/2018 | 08/04/2018 
3   |    A           |   02/04/2018 | 05/04/2018
4   |    C           |   04/04/2018 | 06/04/2018
5   |    B           |   05/04/2018 | 08/04/2018

我想根据日期范围(从 start_date 到 end_date)进行选择,其中 id_employee 有重复数据(日期范围冲突)

我可以使用什么查询

【问题讨论】:

  • 有了那个样本表数据,预期的结果是什么?
  • 这是样本数据,id= 1,2 和 id= 2,5 是日期范围的冲突,我想选择日期范围冲突的数据
  • 添加预期输出和解释以获得更好的答案
  • 我想要的输出,Id_employee A 和 B,因为日期范围冲突

标签: mysql sql


【解决方案1】:
SELECT `id`, `id_employee`
FROM Table1
WHERE id_employee IN ( 
SELECT T1.id_employee
FROM `Table1` T1 
INNER JOIN
`Table1` T2
ON T1.id_employee=T2.id_employee
AND T1.id <> T2.id
AND DATE(T1.start_date)<=DATE(T2.enddate)
AND DATE(T1.enddate)>= DATE(T2.start_date)
GROUP BY T1.id_employee 
HAVING COUNT(T1.id_employee) > 1
)
ORDER BY id_employee

输出

id  id_employee
1   A
3   A
2   B
5   B

演示

http://sqlfiddle.com/#!9/f1d9c9/32

【讨论】:

  • 欢迎! @YanuarIhsan
  • 抱歉还有一个问题,如果我想用“ID”列显示结果
  • 对于 A 和 B,您希望它们之间的最大或最小 ID 为哪个 ID
  • 编辑了我的答案@YanuarIhsan
  • 对不起,如果要显示数据冲突的日期,那么结果总数为8,@JayShankarGupta
【解决方案2】:

您的表格显示 3 id_employee 即。 A、B 和 C。假设您想要基于以下日期范围的查询,您的问题不清楚:

SELECT id_employee FROM schema.table where start_date>='2018-04-01' and end_date<='2018-04-08' group by id_employee;

【讨论】:

  • 不是来自特定范围(开始日期和结束日期),即样本数据
  • 您可以在程序中使用 while 循环,而不是从查询中查找所需的结果。
【解决方案3】:
select aa.id
from `table` aa
where exists (select * from `table` bb
where bb.id <> aa.id and (bb.start_date between aa.start_date and aa.enddate
or bb.enddate between aa.start_date and aa.enddate or
aa.start_date between bb.start_date and bb.enddate
or aa.enddate between bb.start_date and bb.enddate))

这一项检查重叠的日期和不同的 id。我想应该是你要找的。​​p>

【讨论】:

  • 您的日期字段是否使用日期时间数据类型?
  • result 是 id_employee 的全部,这仍然是错误的 :(
【解决方案4】:

我认为最简单的方法是:

select t.*
from t
where exists (select 1
              from t t2
              where t2.id_employee = t.id_employee and
                    t2.id <> t.id and
                    t2.start_date < t.end_date and
                    t2.end_date > t.start_date
             );

Here 是一个 SQL Fiddle。

您可以通过将范围添加到外部查询来添加日期范围:

select t.*
from t
where exists (select 1
              from t t2
              where t2.id_employee = t.id_employee and
                    t2.id <> t.id and
                    t2.start_date < t.end_date and
                    t2.end_date > t.start_date
             ) and
     t.start_date <= ? and
     t.end_date >= ?;

【讨论】:

    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    相关资源
    最近更新 更多