Еженедельный диапазон времени между днями - PullRequest
1 голос
/ 02 июня 2011

У меня установлено еженедельное расписание с вечера пятницы 2011-05-27 18: 00 до утра понедельника 2011-05-30 06: 00 . Этот график, выполняемый каждую неделю, начинается с 2011-05-27 . Как мы можем определить время события (2011-06-06 19:00), попадающее в этот недельный график?

UPDATE

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

Здесь повторение происходит каждую неделю.

С уважением,

Greepty

Ответы [ 2 ]

0 голосов
/ 02 июня 2011

Возможный подход к этой проблеме:

  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)
0 голосов
/ 02 июня 2011

Если я вас правильно понимаю, вы хотите проверить, не упадет ли дата между СР и Пн.

В этом случае вы можете просто сделать SELECT DATENAME(WEEKDAY, '6-Jun-2011'), и если это произойдет в один из дней, когда выответ, вам нужно будет просто проверить компонент времени.

...