我一直在研究这个问题已经有一段时间了,我似乎无法找到解决方案,希望有人可以提供帮助。
目前我正在使用Microsoft SQL服务器管理,我一直在尝试执行以下操作:
以前,旧查询只返回两个日期之间的结果 继前面的查询:
SELECT e.Name, o.StartDate, o.EndDate
FROM dbo.Name e, dbo.Date o
WHERE
where e.Name = o.Name
and o.StartDate <= '2010-09-28 23:59:59'
and o.EndDate >= '2010-9-28 00:00:00'
and e.Name like 'A'
查询运行后生成的示例表(真正的表显然有很多行:P):
Name Start End
A 2010-09-28 07:00:00 2010-09-28 17:00:00
A 2010-09-28 13:45:00 2010-09-28 18:00:00
A 2010-09-28 08:00:00 2010-09-28 16:00:00
A 2010-09-28 07:00:00 2010-09-28 15:30:00
但是我们需要更改它,以便查询执行以下操作:
找到相交一天x的日期 找到一天x不相交的日期
我找到了一个真正有用的网站 http://bloggingabout.net/blogs/egiardina/archive/2008/01/30/check-intersection-of-two-date-ranges-in-sql.aspx 但是输入要比较的日期,另一方面,我的所有日期都相交/不相交。
感谢大家的帮助。
答案 0 :(得分:2)
相交的日期:
SELECT
E.name,
O.start_date,
O.end_date
FROM
dbo.Names E
INNER JOIN dbo.Dates O ON
O.name = E.name AND
O.start_date < @end_date AND
O.end_date > @start_date
WHERE
E.name LIKE 'A'
不相交的日期与日期相反:
SELECT
E.name,
O.start_date,
O.end_date
FROM
dbo.Names E
INNER JOIN dbo.Dates O ON
O.name = E.name AND
(O.start_date > @end_date OR
O.end_date < @start_date)
WHERE
E.name LIKE 'A'
我没有说明日期的完全匹配。决定如何处理这些,然后进行相应的调整。
答案 1 :(得分:2)
尝试以下方法:
SELECT e.Name, o.StartDate, o.EndDate
FROM dbo.Name e, dbo.Date o
WHERE
where e.Name = o.Name
and o.StartDate <= '2010-09-28 23:59:59'
and o.EndDate >= '2010-09-28 00:00:00'
and exists
(select null from dbo.Date o2
where o.Name = o2.Name and
o.StartDate <= o2.EndDate and
o.EndDate >= o2.StartDate and
o.ID <> o2.ID)
交叉日期;对于不相交的日期,改变..并且存在...到......并且不存在... (我假设dbo.Date有一个名为ID的主键字段 - 您希望防止日期范围重叠。)