Функция даты в COBOL - PullRequest
       9

Функция даты в COBOL

1 голос
/ 07 ноября 2011

В моем проекте есть расчет, подобный дате начала займа: должна быть дата начала + 5 рабочих дней.Мне удалось узнать текущую дату, но я не знаю, как это сделать.Может ли кто-нибудь помочь мне.

Ответы [ 5 ]

3 голосов
/ 11 ноября 2011

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

Если вам в конечном итоге понадобится создать свою собственную логику, вы сделаете всем одолжение, создав функцию, и тогда вы не обязаны реализовывать это в COBOL.

0 голосов
/ 07 ноября 2011

Вы также можете выполнить то же самое, используя приведенный ниже запрос SYSDUMMY1:

SELECT (CURDATE()+5 days) 
FROM SYSIBM.SYSDUMMY1
WITH UR;

см. Основы DB2: развлечения с датами и временем

0 голосов
/ 07 ноября 2011

Посмотрите этот пример кода, чтобы узнать, как написать собственную процедуру обработки даты.

http://www.cobug.com/cobug/docs/futureDateCalc.html

Предполагается, что вы можете определить, в какой день недели вы находитесьсейчас.(Используйте функцию INTEGER OF DATE, разделите то, что вы получите, на 7, а остаток - на день недели - от 1 с понедельника по 7 в воскресенье.)

Если дата начала всегда совпадает с днем, когда вы на самом делезапустите код, вы также можете выполнить ACCEPT (переменная PIC 9) FROM DAY-OF-WEEK, и вы получите 1 в понедельник и 7 в воскресенье.Это работает только для текущей даты.

0 голосов
/ 07 ноября 2011

Хотя это и достаточно легко заявить, ваша задача на самом деле довольно сложна для реализации.

Как правило, компиляторы COBOL поддерживают ряд встроенных функций, которые вы можете использовать для выполнения простой арифметики дат.INTEGER-OF-DATE и DATE-OF-INTEGER являются двумя примерами.INTEGER-OF-DATE берет дату в формате «ГГГГММДД» и преобразует ее в число дней от контрольной даты, ДАТА-ИНТЕГЕР берет количество дней с той же контрольной даты и преобразует ее в формат «ГГГГММДД»,Очень просто создать третью подпрограмму для выполнения простой арифметики дат с использованием этих функций.Пока все хорошо.

Сложная часть вашей проблемы - определение: 5 рабочих дней.Как правило, выходные дни и определенные праздничные дни не считаются «рабочими днями», поэтому фактическое количество дней, которое вам нужно добавить, может варьироваться от 5 до нескольких более 5. Например, если выходные дни не учитываются, а деньучитывая, что ваш расчет - пятница, вам нужно добавить 5 + 2 = 7 дней для учета субботы и воскресенья, которые не являются рабочими днями.

Если выходные дни - это все, о чем вам нужно беспокоиться, тогдаНе так уж сложно определить, на какой день недели приходится данный день, используя Конгруэнтность Целлера .Затем, исходя из начального дня недели, вы можете легко определить, нужно ли добавлять 5, 6 или 7 дней к начальной дате.

Действительно сложная часть - это определение других «нерабочих дней»,Обычно для этого вам нужна какая-то таблица поиска просто потому, что локализация определяет, что это будет;и фактический день года меняется на несколько выходных (например, второй понедельник месяца).Нет простого способа выполнить эту часть работы.В системах, над которыми я работал, мы используем внутреннюю стандартную подпрограмму, которую приложения вызывают, чтобы получить «нерабочее» определение даты.Процедура принимает в качестве входных данных дату и параметр локализации и возвращает логическое значение Да / Нет в зависимости от того, является ли данная дата нерабочей для данной локализации.Я подозреваю, что вам нужно будет реализовать нечто подобное.Важно, чтобы вы использовали какую-то корпоративную общепринятую стандартную процедуру для определения нерабочих дат, чтобы убедиться, что все ваши системы соответствуют друг другу (не очень хорошо, если система «А» определяет, что данная дата не является коммерческой).день, когда система «Б» рассматривает это как обычный рабочий день)

0 голосов
/ 07 ноября 2011

Проверьте документацию вашего компилятора. У вас должен быть формат данных, который представляет собой число дней с первого числа года или количество дней с некоторой произвольной даты (1 января 1900 года и 1 января 1600 года являются популярными вариантами).

Должен быть способ использования библиотек поддержки времени выполнения ваших компиляторов для преобразования результата «Function Current-Date» в одну из этих форм. Тогда сложение и вычитание дней легко (или проще). После добавления дней преобразуйте результат в любой нужный вам формат.

Кроме того, вы можете написать свои собственные процедуры обработки даты. Вам просто нужно использовать «перенос» для месяцев и лет, даже если вы пересекаете границу месяца или года.

...