sql高手看过来!
这个问题提过的,不过还是没有解决。
id startTime endTime
1 2003-1-1 00:00:00 2003-1-1 01:00:00
2 2003-1-1 00:50:00 2003-1-1 02:00:00
3 2003-1-1 03:00:00 2003-1-1 03:10:00
4 2003-1-1 03:05:00 2003-1-1 04:00:00
查询结果为:
startTime endTime
2003-1-1 00:00:00 2003-1-1 02:00:00
2003-1-1 03:00:00 2003-1-1 04:00:00
解释:
查询数据库中的记录,时间如果有交叉的,那么取开始时间最早的作为开始时间,取结束时间最晚的作为结束时间。就是说有时间交叉的数据就联接起来形成一个记录。
可以考虑用临时表或者其他什么方法,能实现就好。。。。。。。。。。
问题点数:0、回复次数:22Top
1 楼tiangua771118(甜瓜)回复于 2003-08-04 10:53:29 得分 0
晕 我想问问如果有100条记录 其中99条时间重复 你是不是生成两条记录就可以呀 ??
楼主说清楚点 如果象我说的这样 你可以写存储过程的呀 !!如果象我说的这样没错的话 如果你不会写我帮你写好了!Top
2 楼jz_bnx(蓝羽)回复于 2003-08-04 10:59:34 得分 0
关注学习Top
3 楼xjdawu(无法界定)回复于 2003-08-04 11:12:22 得分 0
select min(startTime),max(endTime) from tabName group by to_char(startTime,'yyyy-mm-dd HH24')Top
4 楼xjdawu(无法界定)回复于 2003-08-04 11:15:10 得分 0
上面的SQL在oracle中通过了,换别的数据库要换一下函数吧Top
5 楼Brookes(边走边唱)回复于 2003-08-04 11:27:58 得分 0
关注...Top
6 楼kevin_gao(困了!累了!睡觉了!)回复于 2003-08-04 11:30:53 得分 0
to:tiangua771118(甜瓜) “有100条记录 其中99条时间重复”,确实只要生成两条记录就行了。
to xjdawu():你估计没有理解我的意思,你这个是找出当天最小时间和当天最大时间,然后拼成新的时间,这是不对的。
如果表是这样的
id starttime endtime
1 2003-8-4 9:00:00 2003-8-4 10:00:00
2 2003-8-4 11:00:00 2003-8-4 12:00:00
像这样的记录是不用合并的,即还是保留原来的记录。
实际就是说有时间交叉的记录就要合并成新记录Top
7 楼jiejifeng(zj)回复于 2003-08-04 11:39:30 得分 0
xjdawu() 的方法就行Top
8 楼xjdawu(无法界定)回复于 2003-08-04 11:45:10 得分 0
晕了,把那个写“取时间提交到数据库”的人拖出来扁扁扁...Top
9 楼jiejifeng(zj)回复于 2003-08-04 11:45:40 得分 0
这样啊,那你可以用循环读记录,比如从 starttime最小的开始,得到其 endtime(A),然后再找别的starttime小于(A)的,再看被找到记录的 endtime是否小于(A),如小,删掉此记录,如大,则把此endtime赋给A,next...
基本思想就这样,具体算法就看你的经验了。Top
10 楼kevin_gao(困了!累了!睡觉了!)回复于 2003-08-04 11:52:25 得分 0
楼上的好像不容易实现,直接用sql如何实现?Top
11 楼kevin_gao(困了!累了!睡觉了!)回复于 2003-08-04 12:30:13 得分 0
我 顶!!!Top
12 楼inanition(空洞)回复于 2003-08-04 12:35:54 得分 0
用这个试试,应该可以消除一次交叉,设表名为tbldT:
SELECT a.id, a.startttime, b.endttime
FROM tblDT AS a, tblDT AS b
WHERE b.starttime<a.endtime and b.starttime>a.starttime
ORDER BY a.starttime, b.starttimeTop
13 楼fly7801(笨苍蝇先飞)回复于 2003-08-04 12:48:49 得分 0
xjdawu() 的方法是正确的,分组后取时间是可以实现的
Top
14 楼fly7801(笨苍蝇先飞)回复于 2003-08-04 12:52:07 得分 0
inanition(空洞) 的方法完全正确
Top
15 楼feiyun2001(菩提本无树,明镜也非台)回复于 2003-08-04 13:00:40 得分 0
有什么意义?Top
16 楼kevin_gao(困了!累了!睡觉了!)回复于 2003-08-04 13:09:51 得分 0
inanition(空洞)的方法有问题的! 你看这样的数据,你选出来对么?
1 2003-07-01 09:00:00.000 2003-07-01 10:00:00.000
2 2003-07-01 09:30:00.000 2003-07-01 11:00:00.000
3 2003-07-02 10:00:00.000 2003-07-02 11:00:00.000
4 2003-07-02 11:00:00.000 2003-07-02 12:00:00.000 Top
17 楼Brookes(边走边唱)回复于 2003-08-04 14:25:23 得分 0
SELECT a.id, a.startTime,'endTime'=
CASE
WHEN a.endTime>b.endTime THEN a.endTime
ELSE b.endTime
END
FROM yourTable a, yourTable b
WHERE b.startTime>a.startTime and b.startTime<a.endTime
Top
18 楼kevin_gao(困了!累了!睡觉了!)回复于 2003-08-04 15:01:36 得分 0
楼上的也不对,再按如下数据测试一下看看:
1 2003-07-01 09:00:00.000 2003-07-01 10:00:00.000
2 2003-07-01 09:30:00.000 2003-07-01 11:00:00.000
3 2003-07-02 10:00:00.000 2003-07-02 11:00:00.000
4 2003-07-02 11:00:00.000 2003-07-02 12:00:00.000
5 2003-07-01 09:40:00.000 2003-07-01 09:50:00.000
6 2003-07-02 12:00:00.000 2003-07-02 15:00:00.000
7 2003-07-03 12:00:00.000 2003-07-03 15:00:00.000
8 2003-07-02 12:00:00.000 2003-07-02 15:00:00.000
9 2003-07-04 12:00:00.000 2003-07-04 15:00:00.000
10 2003-07-04 14:00:00.000 2003-07-04 20:00:00.000 Top
19 楼xjdawu(无法界定)回复于 2003-08-04 15:20:32 得分 0
kevin_gao , 如果是实际情况,分析一下时间样本吧,给偶们描述一下记录的特征吧?比如记录更新的频率?每小时,每分钟?
如果有这样一条记录
n 1900-01-01 14:00:00.000 2010-01-01 00:00:00.000
那表里面还用放记录吗?
Top
20 楼kevin_gao(困了!累了!睡觉了!)回复于 2003-08-04 15:55:20 得分 0
我好像自己解决了!
set nocount on
declare @startTime datetime;
declare @endTime datetime;
declare @roomid int;
declare @startTime1 datetime;
declare @endTime1 datetime;
declare @roomid1 int;
select top 1 @startTime=starttime,@endTime=endtime,@roomid=roomid from myTable order by roomid,starttime;
select * into #tmp_result from myTable where 1<>1;
DECLARE my_cursor CURSOR FOR
SELECT starttime, endtime,roomid FROM myTable
ORDER BY roomid,starttime
OPEN my_cursor
FETCH NEXT FROM my_cursor
INTO @starttime, @endtime,@roomid
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM my_cursor
INTO @startTime1, @endtime1,@roomid1
if(@startTime1<=@EndTime)and(@roomId1=@roomId)
begin
if(@EndTime1>@EndTime)
Set @EndTime=@EndTime1
end
else
begin
insert into #tmp_result(starttime,endtime,roomid) values(@starttime,@endtime,@roomid);
Set @StartTime=@StartTime1
Set @EndTime=@EndTime1
Set @RoomId=@RoomId1
end
END
insert into #tmp_result(starttime,endtime,roomid) values(@starttime,@endtime,@roomid);
CLOSE my_cursor
DEALLOCATE my_cursor
select * from #tmp_result;
GOTop
21 楼inanition(空洞)回复于 2003-08-04 17:22:43 得分 0
偶说了偶只解决了一次交叉,多次交叉或无限交叉还没想出来。
楼主的方法已经是一段程序了,只能在SQL SERVER中用吧。
Top



