SQL - 将开始/结束时间分成15分钟记录

时间:2010-05-27 14:00:25

标签: sql sql-server firebird

我有一个记录集,包含两个独立字段中的开始和结束时间:

id - Int
startTime - DateTime
endTime - DateTime

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

例如,假设我有这样的记录:

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

我将返回3条记录,第一条记录代表8:15区间,#2代表8:30区间,然后是3分钟代表8:45区间。

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

3 个答案:

答案 0 :(得分:2)

为什么不用服务器端语言进行处理?它会更容易,肯定会让你成为数据库中立的。

答案 1 :(得分:1)

似乎有两种基本方法 1.迭代地计算每个间隔(循环或递归) 2.使用查找表

由于一些函数的实现(用于递归计算)甚至对循环的定义都会有所不同,因此最通用的似乎是查找表。它也可能很快。

答案 2 :(得分:0)

我同意Keith的说法,这可能在应用程序中做得更好。对于大型源表,服务器和查找表的交叉连接将变得昂贵,但只是为了好玩,我编写了一个快速的样本。

   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)