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

ASE 12.5.3

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

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

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

Кто-то решал подобные задачи методами SQL? Помогите советом пожалуйста.
...
Рейтинг: 0 / 0
07.09.2009, 08:59
    #36181065
Mikle83
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение первого рабочего дня относительно заданной даты.
Сталкивался с такой задачей - решал "прямым ударом в лоб":
в отдельную таблицу вносятся вообще все не рабочие дни (таблица просто имеет один столбец типа DateTime) а далее рисуется простейшая процедура, которая по переданной дате возвращает минимально дату из таблицы больше указанной.
...
Рейтинг: 0 / 0
07.09.2009, 09:02
    #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
09.09.2009, 12:16
    #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
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Определение первого рабочего дня относительно заданной даты. / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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