2010-05-27 71 views
0

我有一个包含的开始和结束时间的记录集在两个不同的领域:SQL - 打破了开始/结束时刻15分钟记录

id - Int 
startTime - DateTime 
endTime - DateTime 

我想找到一种方法查询记录并根据在开始和结束时间之间找到的15分钟间隔的数量将其作为X记录返回。

例如,假设我有这样的记载:在8:30的时间间隔,然后

id, StartTime, EndTime 
1, 1/1/2010 8:28 AM, 1/1/2010 8:47 AM 

我将返回3条记录,第一个将代表8:15间隔,#2 8点45分的时间间隔。

我意识到这可以使用sproc中的逻辑完成,但我们试图保持db中立,因为我们支持多个数据库引擎。

+0

'但我们试图保持db中立,因为我们支持多个数据库引擎。“这是一个好意,但使用日期需要数据库特定的功能。因为你需要抽空排队,sql server可以使用CTE,但我不认为firebird具有CTE支持,所以请使用[数字表](http://stackoverflow.com/questions/1393951/什么 - 是最最好的方式,以创建和填充-A-数表)。 – 2010-05-27 14:07:56

回答

0

我同意基思,这可能是一个更好的应用程序完成。服务器和交叉连接到查找表将花费昂贵的大型源表,但只是为了好玩,我制作了一个快速示例。

declare @QuarterHours table (
     QuarterHour time 
    ) 

    declare @x time 
    set @x = '00:00' 

    insert into @QuarterHours 
     (QuarterHour) 
     values 
     (@x) 
    set @x = DATEADD(minute, 15, @x) 

    while @x <> '00:00' begin 
     insert into @QuarterHours 
      (QuarterHour) 
      values 
      (@x) 
     set @x = DATEADD(minute, 15, @x) 
    end /* while */ 

    declare @test table (
     id int, 
     starttime datetime, 
     endtime datetime 
    ) 

    insert into @test 
     (id, starttime, endtime) 
     values 
     (1, '2010-01-01 08:28', '2010-01-01 08:47') 

    select t.id, q.QuarterHour 
     from @test t 
      cross join @QuarterHours q 
     where q.QuarterHour between cast(t.starttime as time) and cast(t.endtime as time) 
2

为什么不用服务器端语言进行处理?这会容易得多,而且一定会让你成为db-neutral。

1

似乎有两种基本方法。
1.迭代caclulate每个间隔(可以是环或递归)
2.使用的查找表

作为一些功能的implentation(递归计算),甚至把定义为循环会有所不同,最通用的似乎是一个查找表。它也可能非常快。