powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Определение первого рабочего дня относительно заданной даты.
4 сообщений из 4, страница 1 из 1
Определение первого рабочего дня относительно заданной даты.
    #36180638
Павел Н
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, уважаемые спецы и не только.

ASE 12.5.3

У меня есть такая задача:
Скрипт генерирует серию записей по заданному алгоритму (например, график погашения кредита).
Дата в каждом погашении должна быть рабочим днем.
Необходимо корректировать дату таким образом, чтобы это был первый рабочий день после расчетной даты (или до нее, зависит от задачи) (включая саму расчетную дату).
Алгоритм определения выходных простой, по дням недели. Праздничные дни забиты в отдельную таблицу.

На данный момент я решаю подобную задачу с помошью утилиты на Delphi, которой передаю имя таблицы, ключевые поля, поле для корректировки и инкремент. По этим параметрам утилита генерирует update комманды и выполняет их. Но этот вариант немного громоздкий и не удобный.

Также, написал на JAVA встроенную процедуру. Получилось красиво, удобно, но и тут меня постигла неудача - у клиентов нет лицензии на использование встроенных процедур на JAVA.

Кто-то решал подобные задачи методами SQL? Помогите советом пожалуйста.
...
Рейтинг: 0 / 0
Определение первого рабочего дня относительно заданной даты.
    #36181065
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сталкивался с такой задачей - решал "прямым ударом в лоб":
в отдельную таблицу вносятся вообще все не рабочие дни (таблица просто имеет один столбец типа DateTime) а далее рисуется простейшая процедура, которая по переданной дате возвращает минимально дату из таблицы больше указанной.
...
Рейтинг: 0 / 0
Определение первого рабочего дня относительно заданной даты.
    #36181071
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один вариант - джойнить темповую таблицу по принципу

Код: plaintext
1.
2.
join DateTemp DT on DT.DateTime > NeedTable.NeedDate
 left join DateTemp DTEarly on (DTEarly.DateTime > NeedTable.NeedDate) And  (DTEarly.DateTime < DT.DateTime)
where DTEarly.DateTime is null

но тут надо оценивать время работы запроса, критичность индексов и т.п.
...
Рейтинг: 0 / 0
Определение первого рабочего дня относительно заданной даты.
    #36185950
Павел Н
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо.
Нашел простое решение и хочу поделиться им с вами.
Суть решения заключается в корректировке поля с датой до тех пор, пока не будет 0 обновлений.
Вот пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
--------------------------------------------------------------------------------
-- Корректировка даты

  declare @rc int
  select @rc =  1 
  declare @inc int
  select @inc = - 1   --инкремент (1 - искать первый рабочий вперед, -1 - искать первый рабочий назад)
  
  while @rc >  0 
    begin
      update mig..MG_FM_CLIENT_INDVL set
        BIRTH_DATE = dateadd(day, @inc, BIRTH_DATE)
      where 
        (BIRTH_DATE in (select HOL_DAY from mig..STB_HOLIDAYS)
        or datepart(weekday, BIRTH_DATE) in ( 1 , 7 ))
      select @rc = @@rowcount
    end

В таблице STB_HOLIDAYS находятся специфичные нерабочие дни (праздники, переносы и т.п.). Суббота, воскресенье - по-умолчанию нерабочие дни.

Примерно за 3 итерации скрипт отрабатывает.

Пока ничего проще не нашел.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Определение первого рабочего дня относительно заданной даты.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]