CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  ASP

sql高手看过来!

楼主kevin_gao(困了!累了!睡觉了!)2003-08-04 10:45:38 在 Web 开发 / ASP 提问

这个问题提过的,不过还是没有解决。  
   
  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

相关问题

  • sql,看看.
  • SQL 看看
  • SQL???
  • sql????????????????????
  • sql
  • SQL????
  • sql
  • sQl
  • sql
  • sql

关键词

  • 数据库
  • sql
  • endtime
  • starttime
  • roomid
  • 记录
  • tbldt
  • 交叉
  • 时间
  • 方法

得分解答快速导航

  • 帖主:kevin_gao

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo