У меня вопрос, который кажется довольно сложным. Мне нужно было знать, что происходит на сессии в тот день, в определенное время.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
Это является довольно сложным, если кто-то имеет простой способ сделать это было отлично.
Если есть несколько сеансов в течение определенного периода времени, какой результат вы ожидаете? Одна строка для каждого времени и сеанса? Один ряд за время со списком сеансов? – HABO
Это не кажется мне сложным, учитывая то, что вы делаете. –
@HABO Да, одна строка для каждого времени и сеанса. Кажется, это лучшее решение для этого выхода. – PookPook