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

Откуда:
Сообщений: 13
Добрый день.
Задача в следующем. Необходимо выгрузить заявки из системы, которые были зарегистрированы в рабочее время.
Рабочее время: пн-чт с 9 до 18, пт с 9 до 16:45. Так же необходимо учесть праздничные и предпразничные дни. В предпразничный день рабочее время с 9 до 16:45.
Праздничные дни исключил при помощи таблицы, в которой хранятся праздничные дни. Выглядит это примерно так
and incident.date_logged not in ((select hplan1 from hplan_head where hplan_head_id=2))

Выходные исключил так:
and DATEname (WEEKDAY, incident.date_logged) not in ('Sunday', 'Saturday') --исключить выходные

Самое сложное для меня это установить рабочее расписание. Как ограничить выгрузку в предпразничный день до 16:45 если он выпадает на среду (при этом вне праздничного дня выводил до 18:00).
Рабочее расписание выставил как то так:
AND ((((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '16:45:00')) --интервал времени в пятницу
and DATEname (WEEKDAY, incident.date_logged)='Friday') 
or (((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '18:00:00')) --интервал времени в остальные дни недели 
and DATEname (WEEKDAY, incident.date_logged) in ('Monday','Tuesday','Wednesday','Thursday'))

Так же вывел предпразничный день и задал ему рабочее расписание
(((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '16:45:00')) --интервал времени в предпразничный 1 день (смотрит на список выходных) 
and CONVERT(varchar, incident.date_logged, 104)= CONVERT(varchar, DATEADD(day,-1, (select hplan1 from hplan_head where hplan_head_id=2)), 104))


Вопрос: Как мне задать условие if в where, чтобы при выгрузке бралось рабочее расписание, но если выпадает предпразничный день то он выгружал до 16:45?

Полный селект не выкладываю так как он очень большой.
Дополнительно выкладываю часть скрипта как он есть
AND ((((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '16:45:00')) --интервал времени в пятницу
and DATEname (WEEKDAY, incident.date_logged)='Friday') 
or (((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '18:00:00')) --интервал времени в остальные дни недели 
and DATEname (WEEKDAY, incident.date_logged) in ('Monday','Tuesday','Wednesday','Thursday'))
or (((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '16:45:00')) --интервал времени в предпразничный 1 день (смотрит на список выходных) 
and CONVERT(varchar, incident.date_logged, 104)= CONVERT(varchar, DATEADD(day,-1, (select hplan1 from hplan_head where hplan_head_id=2)), 104))
28 авг 19, 14:31    [21959118]     Ответить | Цитировать Сообщить модератору
 Re: if в where  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6680
AlexandrAVG,

не особо разбирая: заведите таблицу календарь, выставьте в неё все свои праздничные, предпразничные, можно даже с 09:00:00 - 18:00:00 и ограничивайте всё на неё, и жить станет проще
28 авг 19, 14:35    [21959124]     Ответить | Цитировать Сообщить модератору
 Re: if в where  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4851
AlexandrAVG
Вопрос: Как мне задать условие if в where...

Откройте для себя синтаксис CASE.
28 авг 19, 15:05    [21959146]     Ответить | Цитировать Сообщить модератору
 Re: if в where  [new]
AlexandrAVG
Member

Откуда:
Сообщений: 13
Megabyte
AlexandrAVG
Вопрос: Как мне задать условие if в where...

Откройте для себя синтаксис CASE.


Можно на примере объяснить, как через case прописать условие if?
Например: Если не предпразничный день и день недели пн-чт, то расписание с 9 до 18
если предпразничный день и день недели пн-чт, то расписание с 9 до 16:45
28 авг 19, 15:24    [21959166]     Ответить | Цитировать Сообщить модератору
 Re: if в where  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1112
AlexandrAVG
Megabyte
пропущено...

Откройте для себя синтаксис CASE.


Можно на примере объяснить, как через case прописать условие if?
Например: Если не предпразничный день и день недели пн-чт, то расписание с 9 до 18
если предпразничный день и день недели пн-чт, то расписание с 9 до 16:45


AND CONVERT(varchar, incident.date_logged, 108) < case when DATEname (WEEKDAY, incident.date_logged) = 'Friday' then '16:45:00' else '18:00:00' end
28 авг 19, 16:10    [21959220]     Ответить | Цитировать Сообщить модератору
 Re: if в where  [new]
AlexandrAVG
Member

Откуда:
Сообщений: 13
сделал через исключение
AND (((((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '16:45:00')) --интервал времени в пятницу
and DATEname (WEEKDAY, incident.date_logged)='Friday') 
or (((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '18:00:00')) --интервал времени в остальные дни недели 
and DATEname (WEEKDAY, incident.date_logged) in ('Monday','Tuesday','Wednesday','Thursday')))
and not (((CONVERT(varchar, incident.date_logged, 108) > '16:45:00') AND (CONVERT(varchar, incident.date_logged, 108) < '18:00:00')) --интервал времени в предпразничный 1 день (смотрит на список выходных) 
and CONVERT(varchar, incident.date_logged, 104)= CONVERT(varchar, DATEADD(day,-1, (select hplan1 from hplan_head where hplan_head_id=2)), 104))

задал рабочее расписание и добавил исключение в предпразничный день.
в поле hplan1 задается праздничный день

всем спасибо за ответы!
29 авг 19, 10:50    [21959629]     Ответить | Цитировать Сообщить модератору
 Re: if в where  [new]
144m
Member

Откуда:
Сообщений: 7
AlexandrAVG,

А Вы учли в итоговом коде переносы рабочих дней на выходные, когда суббота или воскресенье объявляются рабочими днями?
2 сен 19, 18:53    [21962118]     Ответить | Цитировать Сообщить модератору
 Re: if в where  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3151
AlexandrAVG
сделал через исключение
AND (((((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '16:45:00')) --интервал времени в пятницу
and DATEname (WEEKDAY, incident.date_logged)='Friday') 
or (((CONVERT(varchar, incident.date_logged, 108) > '09:00:00') AND (CONVERT(varchar, incident.date_logged, 108) < '18:00:00')) --интервал времени в остальные дни недели 
and DATEname (WEEKDAY, incident.date_logged) in ('Monday','Tuesday','Wednesday','Thursday')))
and not (((CONVERT(varchar, incident.date_logged, 108) > '16:45:00') AND (CONVERT(varchar, incident.date_logged, 108) < '18:00:00')) --интервал времени в предпразничный 1 день (смотрит на список выходных) 
and CONVERT(varchar, incident.date_logged, 104)= CONVERT(varchar, DATEADD(day,-1, (select hplan1 from hplan_head where hplan_head_id=2)), 104))

задал рабочее расписание и добавил исключение в предпразничный день.
в поле hplan1 задается праздничный день

всем спасибо за ответы!


не за што, надежда только на то, что этот скрипт будет работать не где-нибудь в центре по отработке ориентации ракет в безвоздушном пространстве
3 сен 19, 11:19    [21962321]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить