查找一个日期是否被另一日期段包含,即找出日期交集的记录数据库的结构是:ID pID Date
1 10 2011-03-01
2 10 2011-03-15
3 11 2011-04-15
4 12 2011-03-06
5 12 2011-03-08
6 13 2011-03-06相同pID,如果有两条记录的话Date相当于是开始日期,结束日期,如果只有一条记录Date相当于开始日期,没有结束日期搜索日期:2011/03/06 - 2011/03/08 想要的结果是ID=1,2,6的记录;
日期:2011/03/01 - 2011/03/15 想要的结果是ID=4,5,6的记录;请问SQL语句怎么写?
1 10 2011-03-01
2 10 2011-03-15
3 11 2011-04-15
4 12 2011-03-06
5 12 2011-03-08
6 13 2011-03-06相同pID,如果有两条记录的话Date相当于是开始日期,结束日期,如果只有一条记录Date相当于开始日期,没有结束日期搜索日期:2011/03/06 - 2011/03/08 想要的结果是ID=1,2,6的记录;
日期:2011/03/01 - 2011/03/15 想要的结果是ID=4,5,6的记录;请问SQL语句怎么写?
select pid,[开始日期],(case when [结束日期] = [开始日期] then null else [结束日期] end) [结束日期]
from(
select pid,min(date) [开始日期],max(date) [结束日期]
from tb
group by pid
)t
1 2011-03-01 2011-03-15
2 2011-04-13 2011-04-18
3 2011-03-06 2011-03-10
4 2011-03-11 2011-03-13
4 2011-05-11 2011-6-13
搜索日期:2011/03/06 - 2011/03/08 想要的结果是ID=1的记录;
日期:2011/03/01 - 2011/03/15 想要的结果是ID=3,4的记录;
日期:2011/04/13 想要的结果是ID=2的记录;
查找的时间段是否被另一时间段所包含或者有没有包含其它时间段,把包含或被包含的记录取出来请问用SQL怎么写?
CREATE TABLE t (id INT ,pid INT ,date VARCHAR(20))
INSERT t
SELECT 1, 10, '2011-03-01' UNION ALL
SELECT 2, 10, '2011-03-15' UNION ALL
SELECT 3, 11, '2011-04-15' UNION ALL
SELECT 4, 12, '2011-03-06' UNION ALL
SELECT 5, 12, '2011-03-08' UNION ALL
SELECT 6, 13, '2011-03-06'
SELECT id
FROM dbo.t
WHERE pid IN ( SELECT pid
FROM ( SELECT *
FROM dbo.t a
WHERE NOT EXISTS ( SELECT 1
FROM dbo.t b
WHERE a.pid = b.pid
AND a.date > b.date )
) c
WHERE c.date <= '2011-03-06' ) --所有开始时间小于等于2011-03-06的pid
AND pid IN (
SELECT pid
FROM dbo.t
WHERE id NOT IN ( SELECT id
FROM dbo.t a
WHERE NOT EXISTS ( SELECT 1
FROM dbo.t b
WHERE a.pid = b.pid
AND a.date > b.date ) )
AND dbo.t.date > '2011-03-08'--结束时间大于2011-03-08的pid
UNION ALL--交集
SELECT pid
FROM dbo.t
GROUP BY pid
HAVING COUNT(id) = 1 )--没有结束时间的pid
id
-----------
1
2
6(3 行受影响)