2010-05-27 79 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(遞歸計算),甚至把定義爲循環會有所不同,最通用的似乎是一個查找表。它也可能非常快。

相關問題