Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Работа с расписанием регулярных событий  [new]
design21
Member

Откуда: Minsk
Сообщений: 59
Есть расписание регулярных поездок. Оно хранится при помощи двух таблиц:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbRoutes]') AND type in (N'U'))
DROP TABLE [dbo].[tbRoutes]
CREATE TABLE [dbo].[tbRoutes] (RouteId INT,RouteDesc VARCHAR(100))

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbRoutesWeekDays]') AND type in (N'U'))
DROP TABLE [dbo].[tbRoutesWeekDays]
CREATE TABLE [dbo].[tbRoutesWeekDays] (RouteId INT,WeekDayId VARCHAR(100))


tbRoutes - хранит список маршрутов
tbRoutesWeekDays - хранит дни недели в которые происходит поездка по маршруту (WeekDayId - это номер дня недели [1..7])

пользователь должен иметь возможность указать конкретную дату, и отклонение ( +/-) 0-4 дней.
Например: пользователь хочет уехать 25.12.2012 +/- 3 дня.

если без отклонения то все просто:
DECLARE @Date DATETIME = '20121126' -- дата поездки
DECLARE @X INT = 0 -- отклонение 

SELECT r.RouteId,r.RouteDesc
FROM [dbo].[tbRoutes] r
JOIN [dbo].[tbRoutesWeekDays] rwd ON rwd.RouteId=r.RouteId
WHERE datepart(dw,@Date) = rwd.WeekDayId


а с отклонением у меня получается что-то уж очень сложное вычисление:
(7 + datepart(dw,@Date)-@X) % 7 - как начальный день недели
(7 + datepart(dw,@Date)+@X) % 7 - как конечный недели

а дальше какие-то манипуляции чтобы определить что больше что меньше и вычислить интервал.


Помогите пожалуйста составить условие запроса, для выбора подходящих пользователю маршрутов с отклонениями от даты.
25 ноя 12, 18:14    [13525804]     Ответить | Цитировать Сообщить модератору
 Re: Работа с расписанием регулярных событий  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
В лоб:
declare @Date datetime = '20121126', @X int = 3;

with cte as
(
 select dateadd(day, -@X, @Date) as d, datepart(dw, dateadd(day, -@X, @Date)) as dw
 
 union all
 
 select
  dateadd(day, 1, d), datepart(dw, dateadd(day, 1, d)) as dw
 from
  cte
 where
  dateadd(day, 1, d) <= dateadd(day, @X, @Date)
)
select
 r.RouteId, r.RouteDesc 
from
 cte join
 dbo.tbRoutesWeekDays rwd on rwd.WeekDayId = cte.dw join
 dbo.tbRoutes r on r.RouteId = rwd.RouteId;


А вообще, для решения подобных задач нужно в БД иметь постоянную таблицу натуральных чисел.

ЗЫ: Результат datepart(dw...) зависит от языка соединения.
25 ноя 12, 19:22    [13525974]     Ответить | Цитировать Сообщить модератору
 Re: Работа с расписанием регулярных событий  [new]
design21
Member

Откуда: Minsk
Сообщений: 59
Спасибо!
25 ноя 12, 22:09    [13526595]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить