2013-03-28 2 views
1

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

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

Вы можете увидеть в этой таблице:

idArea | idSession | startDate | startTime  | endTime 
    1 | 1  | 2013-01-01 | 1900-01-01 09:00:00 | 1900-01-01 12:00:00 
    1 | 2  | 2013-01-01 | 1900-01-01 14:00:00 | 1900-01-01 15:00:00 
    1 | 3  | 2013-01-04 | 1900-01-01 09:00:00 | 1900-01-01 13:00:00 
    1 | 4  | 2013-01-07 | 1900-01-01 10:00:00 | 1900-01-01 12:00:00 
    1 | 5  | 2013-01-07 | 1900-01-01 13:00:00 | 1900-01-01 18:00:00 
    1 | 6  | 2013-01-08 | 1900-01-01 10:00:00 | 1900-01-01 12:00:00 

Тогда у меня есть таблица, которая показывает мне все часы вкраплениями, то есть через каждые полчаса (я создал эту таблицу с целью этого требования, если кто-то есть лучшая идея, могу сказать, что я постараюсь адаптироваться).

idHour | Hour 
    1 | 1900-01-01 00:00:00 
    2 | 1900-01-01 00:30:00 
    3 | 1900-01-01 01:00:00 
    ............................ 
    4 | 1900-01-01 09:00:00 
    5 | 1900-01-01 09:30:00 
    6 | 1900-01-01 10:00:00 
    7 | 1900-01-01 10:30:00 
    ............................ 

В конце концов, что это то, что я хочу, чтобы представить это было:

startDate | startTime  | SessionID 
    2013-01-01 | 1900-01-01 09:00:00 |  1 
    2013-01-01 | 1900-01-01 09:30:00 |  1 
    2013-01-01 | 1900-01-01 10:00:00 |  1 
    2013-01-01 | 1900-01-01 10:30:00 |  1 
    2013-01-01 | 1900-01-01 11:00:00 |  1 
    2013-01-01 | 1900-01-01 11:30:00 |  1 
    2013-01-01 | 1900-01-01 11:30:00 |  1 
    2013-01-01 | 1900-01-01 14:00:00 |  1 
    2013-01-01 | 1900-01-01 14:30:00 |  1 
    2013-01-01 | 1900-01-01 15:00:00 |  1 

Эта таблица предназначена только для idSession = 1, что я хотел было для всех сессий. Если нет сеансов на один день, можно вернуть NULL.

Трудный этот запрос или процедура заключается в том, что они должны показывать мне все дни месяца, когда в этой области есть сеансы.

Для этого, я уже использовал этот запрос:

;WITH t1 AS 
(
    SELECT 
     startDate, 
     DATEADD(MONTH, DATEDIFF(MONTH, '1900-01-01', startDate), '1900-01-01') firstInMonth, 
     DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, '1900-01-01', startDate) + 1, '1900-01-01')) lastInMonth, 
     COUNT(*) cnt 
    FROM  
     @SessionsPerArea 
    WHERE 
     idArea = 1 
    GROUP BY 
     startDate 
), calendar AS 
(
    SELECT DISTINCT 
     DATEADD(DAY, c.number, t1.firstInMonth) d 
    FROM  
     t1 
    JOIN 
     master..spt_values c ON type = 'P' 
          AND DATEADD(DAY, c.number, t1.firstInMonth) BETWEEN t1.firstInMonth AND t1.lastInMonth 
) 
SELECT 
    d date, 
    cnt Session 
FROM 
    calendar c 
LEFT JOIN 
    t1 ON t1.startDate = c.d 

Это является довольно сложным, если кто-то имеет простой способ сделать это было отлично.

+0

Если есть несколько сеансов в течение определенного периода времени, какой результат вы ожидаете? Одна строка для каждого времени и сеанса? Один ряд за время со списком сеансов? – HABO

+1

Это не кажется мне сложным, учитывая то, что вы делаете. –

+0

@HABO Да, одна строка для каждого времени и сеанса. Кажется, это лучшее решение для этого выхода. – PookPook

ответ

1

Если я правильно понимаю, это просто соединение между календарным столом и @ SessionPerArea, П ри правильных условиях:

select spa.StartDate, c.hour as StartTime, spa.idSession as SessionId 
from calendar c join 
    @SessionsPerArea spa 
    on c.hour between spa.startTime and spa.EndTime 

Джойн сопрягает все время между начальным и конечным раз в данных , а затем возвращает значения.

+0

Но в этом случае только те возвраты, которые равны. В этом случае - с 09:00 до 14:00. полчаса не появится. – PookPook

+0

@PookPook. , , В своем вопросе вы говорите, что таблица календаря имеет данные за каждые полчаса. Поэтому каждые полчаса должны появляться. –

+0

Я только что закончил тестирование и почти совершенен. Только проблема заключается в том, что он не возвращает все дни месяца. У проблемы даже есть SQL-запрос, который возвращает меня во все дни месяца, согласно SessionArea. Если могут появиться сеансы NULL. – PookPook

0

Я думаю, вам может понадобиться внешнее соединение между календарем и @SessionsPerArea ... так что все дни в таблице календаря возвращаются независимо от соответствия таблице @SessionsPerArea?

+0

Не возвращайте все дни месяца. – PookPook

+0

Ваша таблица календаря включает в себя каждый день, правильно? Значит, это не возвращает все даты? выберите spa.StartDate, c.hour как StartTime, spa.idSession как SessionId из календаря c левым внешним соединением @SessionsPerArea spa c.hour между spa.startTime и spa.EndTime – user2191219

+0

№ Мой табличный календарь возвращает часы , – PookPook

Смежные вопросы