SQL服务器非工作时间计算

时间:2012-07-06 09:13:33

标签: sql sql-server-2005 datetime

非工作时间计算

下面定义的非工作时间日历,这里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

3 个答案:

答案 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