SQL - разбить время начала / окончания на 15-минутные записи - PullRequest
0 голосов
/ 27 мая 2010

У меня есть набор записей, который состоит из времени начала и окончания в двух отдельных полях:

id - Int
startTime - DateTime
endTime - DateTime

Я бы хотел найти способ запросить запись и вернуть ее в виде X записей, основываясь на количестве 15-минутных интервалов, найденных между временем начала и окончания.

Например, допустим, у меня есть такая запись:

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 ]

2 голосов
/ 27 мая 2010

Почему вы не выполняете обработку на серверном языке? Это было бы намного проще и определенно позволило бы вам быть нейтральным по отношению к БД.

1 голос
/ 27 мая 2010

Существует два основных подхода.
1. Итеративно рассчитывать каждый интервал (цикл или рекурсия)
2. Используйте справочную таблицу

Поскольку некоторые функции (для рекурсивных вычислений) и даже определения для циклов будут различаться, наиболее общей будет таблица поиска. Это также может быть очень быстро.

0 голосов
/ 28 мая 2010

Я согласен с Китом, что это, вероятно, лучше сделать в приложении. Сервер и перекрестное объединение с таблицей поиска обойдутся дорого для большой исходной таблицы, но ради интереса я подготовил быстрый пример.

   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)
...