【问题标题】:Weekly Time schedule range between days每周时间安排范围在几天之间
【发布时间】:2011-06-02 23:00:06
【问题描述】:

我有一个从星期五晚上 2011-05-27 18:00 到星期一早上的每周时间表 2011-05-30 06:00。从2011-05-27开始每周执行的这个时间表。我们如何确定活动时间(2011-06-06 19:00)在这个每周计划之间?

更新

ID    StartTime         EndTime            Recurrence  TimeDifferenceInSeconds
1     2011-05-27 18:00  2011-05-30 06:00   1           216000

这里的周期是一周一次。

问候,

喜怒哀乐

【问题讨论】:

  • 您需要提供更多关于数据如何存储的信息(表结构等)
  • @tofutim 表结构如下 ID,StartTime,EndTime,Recurrence,TimeDifferenceInSeconds
  • 你的问题让我很困惑。 27号还是30号开始? 27 号是星期三,30 号是星期一。你是说你想安排事情在每个星期三 - 星期一发生,因此想要检查日期是否在星期三、星期四、星期五、星期六、星期日或星期一?

标签: sql-server time range schedule


【解决方案1】:

解决此问题的一种可能方法:

  1. 获取给定日期/时间与StartTime之间的整周数。

  2. 将周数添加到StartTime 以获得最新的开始时间。

  3. 计算最晚开始时间与给定日期/时间之间的差异。

  4. 检查该差异是否小于TimeDifferenceInSeconds

这就是它的实现方式:

SELECT *
FROM Schedules
WHERE StartTime < @Date AND TimeDifferenceInSeconds >
  DATEDIFF(ss, DATEADD(week, DATEDIFF(day, StartTime, @Date) / 7, StartTime), @Date)

这将返回 @Date 所属的所有计划。

更易于阅读的版本:

WITH NewSchedules AS (
  SELECT
    *,
    NewStartTime = DATEADD(week, DATEDIFF(day, StartTime, @Date) / 7, StartTime)
  FROM Schedule
  WHERE StartTime < @Date
)
SELECT *
FROM NewSchedules
WHERE TimeDifferenceInSeconds > DATEDIFF(ss, NewStartTime , @Date)

【讨论】:

  • **嗨,感谢上述锻炼,这确实是我发布的问题的答案,但需要稍微改变条件以将时间标准与 as-SELECT * FROM NewSchedules 匹配WHERE @Date 在 NewStartTime 和 dateadd(second,TimeDifferenceInSeconds,NewStartTime) 之间。 **
  • @user779291:我明白了。我的意图是构建条件,以便在可能的情况下允许查询优化器使用索引。不过,毫无疑问,您的版本在直觉上更清晰。另一方面,根据您的条件,如果其EndTime@Date 完全匹配,则会选择一行。当然,这取决于您,但根据您示例中的实际时间戳,我假设EndTime 是计划不再有效的时间。这就是我在解决方案中使用TimeDifferenceInSeconds &gt; … 而不是TimeDifferenceInSeconds &gt;= … 的原因。无论如何,我很高兴能帮上忙。
【解决方案2】:

如果我理解正确,您想检查日期是否介于周三和周一之间。

在这种情况下,您可以简单地做一个SELECT DATENAME(WEEKDAY, '6-Jun-2011'),如果那一天是您有答案的那一天,那么您只需检查时间组件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2018-01-28
    相关资源
    最近更新 更多