我有一个似乎相当复杂的问题。我需要知道那天某个会话在某个时间发生了什么。
简单地说,我有一张表格,显示给定区域的所有会话。这些会话有开始日期,开始时间和结束时间。
您可以在此表中看到:
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
然后我还有一张桌子,向我展示所有穿插时间,即每半小时(我为此要求创建了此表,如果有人有更好的想法,我可以说我会尝试适应)。< / p>
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 :(得分: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
连接匹配数据中开始和结束时间之间的所有时间,然后返回值。
答案 1 :(得分:0)
我想也许您只需要在日历和@SessionsPerArea之间进行外部联接...因此,无论与@SessionsPerArea表匹配,都会返回日历表中的所有日期?