下面定义的非工作时间日历,这里WeekNumber从1 =星期一开始到5 =星期五
CalendarId WeekNumber StartTime EndTime
600 1 1900-01-01 00:00 1900-01-01 08:00
600 1 1900-01-01 18:00 1900-01-01 23:59
600 2 1900-01-01 00:00 1900-01-01 08:00
600 2 1900-01-01 18:00 1900-01-01 23:59
600 3 1900-01-01 00:00 1900-01-01 08:00
600 3 1900-01-01 18:00 1900-01-01 23:59
600 4 1900-01-01 00:00 1900-01-01 08:00
600 4 1900-01-01 18:00 1900-01-01 23:59
600 5 1900-01-01 00:00 1900-01-01 08:00
600 5 1900-01-01 18:00 1900-01-01 23:59
我想将这个日历应用到另一个名为events的表中,以查找这些日期和时间的记录吗?
事件表的结构如下
EventID StartDateTime TotalTimeInSec WeekNumber
1 2009-07-05 07:44 100 1
2 2009-07-05 08:40 200 1
3 2009-07-05 09:35 150 1
4 2009-07-05 10:37 200 1
5 2009-07-05 19:37 200 1
6 2009-07-05 20:37 200 1
所需的输出将在编制日历
之后EventID StartDateTime TotalTimeInSec WeekNumber
1 2009-07-05 07:44 100 1
5 2009-07-05 19:37 200 1
6 2009-07-05 20:37 200 1
答案 0 :(得分:1)
Select a.WeekNumber,a.startDateTime,b.starttime,b.EndTime
from tblEvents a,(Select WeekNumber,Starttime,EndTime from tblMain) b
where a.startDateTime between b.starttime and b.EndTime
and a.WeekNumber = b.WeekNumber
答案 1 :(得分:0)
Select E.*
From tblEvent E
Full outer Join tblMain M on E.WeekNumber = M.WeekNumber
Where E.StartDateTime Between M.StartTime and M.EndTime
答案 2 :(得分:0)
我不相信你所要求的全外连接。另一个答案似乎没有处理将时间范围存储为日期时间值的方法。唯一棘手的部分似乎是处理日期数学。您可以找到不同的方法来进行检查,但我认为这是一种解决方案。
SELECT e.*
FROM
Events as e INNER JOIN Calendar as c
ON c.WeekNumber = e.WeekNumber
WHERE
/* CAST(CAST(e.StartDateTime AS TIME) AS DATETIME) -- later versions */
e.StartDateTime - DATEADD(dd, DATEDIFF(dd, 0, e.StartDateTime), 0)
BETWEEN c.StartTime and e.EndTime