【问题标题】:SQL server out of hour calculationSQL Server 超时计算
【发布时间】:2012-07-06 17:44:24
【问题描述】:

非工作时间计算

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

【问题讨论】:

  • @Anoop 你能发布事件的结构吗,为了在两个表之间进行比较,你需要这些表之间的一个公共列。
  • @Viswanathan Iyer 结构已发布。

标签: sql sql-server-2005 datetime


【解决方案1】:

我不相信完全外部联接是您所要求的。而另一个答案似乎没有处理您将时间范围存储为日期时间值的方法。唯一棘手的部分似乎是处理日期数学。您可以找到不同的方法来进行检查,但我认为这是一种解决方案。

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

【讨论】:

    【解决方案2】:
     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
    

    【讨论】:

    • 日历表有周数,应该与事件表进行比较。即对于星期一,事件发生的时间介于日历中的星期一时间之间(WeekNumber = 1)
    【解决方案3】:
    Select E.*
    From tblEvent E
    Full outer Join tblMain M on E.WeekNumber = M.WeekNumber
    Where E.StartDateTime Between M.StartTime and M.EndTime
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多