由于手头没有SQL Server,所以用mysql做的测试:#创建测试用表
CREATE TABLE `test1` (
  `id` int(11) NOT NULL,
  `startDate` datetime DEFAULT NULL,
  `endDate` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;/*Data for the table `test1` */
#插入测试用2条数据
insert  into `test1`(`id`,`startDate`,`endDate`) values (1,'2011-05-19 09:30:00','2011-05-19 10:00:00'),(2,'2011-05-19 11:00:00','2011-05-19 12:00:00');下面是测试用的2条数据:
查询出的结果应该是3条记录,分钟以每5分钟一间隔,获取系统当前时间开始计算:
1.2011-05-18 22:55:00--2011-05-19 09:25:00
2.2011-05-19 10:05:00--2011-05-19 10:55:00
3.2011-05-19 12:05:00--2099-01-01 23:55:00就是要排除掉表里存在的时间段,这个用sql怎么实现,要一条select完成.

解决方案 »

  1.   

    我希望能用一条sql或一个存储过程实现都行.
      

  2.   

    按照你的描述,最后一条记录应该是固定的,开始时间就是最后一个结束时间加5分钟,结束时间是固定的
    试试
    ---测试数据---
    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([id] int,[startDate] datetime,[endDate] datetime)
    insert [tb]
    select 1,'2011-05-20 09:30:00','2011-05-20 10:00:00' union all
    select 2,'2011-05-20 11:00:00','2011-05-20 12:00:00'
     
    ---查询---
    select
      startdate=isnull((select top 1 dateadd(mi,5,enddate) from tb where startdate<t.startdate order by startdate desc),getdate()),
      enddate=(select top 1 dateadd(mi,-5,startdate) from tb where startdate<=t.startdate order by startdate desc)
    from tb t
    union all
    select dateadd(mi,5,max(enddate)),'2099-01-01 23:55:00' from tb---结果---
    startdate               enddate
    ----------------------- -----------------------
    2011-05-20 00:07:02.170 2011-05-19 09:25:00.000
    2011-05-19 10:05:00.000 2011-05-19 10:55:00.000
    2011-05-19 12:05:00.000 2099-01-01 23:55:00.000(3 行受影响)
      

  3.   


    上面图片是我数据库里测试用数据
    下面是我用mysql做的测试sqlselect
      ifnull(
    (
    select date_add(enddate,INTERVAL 5 MINUTE) 
    from test1 
    where startdate<t.startdate# and room='10'
    order by startdate desc
    limit 1
    )
    ,now()) as startDate, (
    select date_add(enddate,INTERVAL -5 MINUTE)
    from test1 
    where startdate<=t.startdate# and room='10'
    order by startdate desc
    limit 1
    ) as endDate,t.room
    from test1 t
    where t.room='10'
    union all
    select date_add(max(enddate),INTERVAL 5 MINUTE),'2099-01-01 23:55:00',room from test1 where room='10'结果如下:
    不过好像结果有点偏差第一条记录的endDate显示的是2011-05-25 09:55:00,按道理应该是
    2011-05-25 08:55:00,呵呵,搞得无语了.上面是里面的数据没有已过期的会议室记录时的问题,如果加入过期的数据如下
    starDate     endDAte  会议室号码
    2011-05-17 09:00:00--2011-05-17 10:00:00 10结果就完全不对了,NND,要人命啊
    麻烦哪位牛人照我8楼写的写个sql server2000的代码给我啊!
    谢谢了,如果能正确出结果我再加会!!