Количество дней между двумя датами

Оценить
(0 голоса)

Когда Crystal Reports выполняет математические операции над полями, содержащими только дату, результат вычислений отображается в целых днях. Crystal Reports возвращает дробные части дня в тех случаях, когда указанные в формуле поля имеют тип даты/времени. Например, при вычитании поля типа даты, содержащего дату “1 мая, 2006”, из поля типа даты, содержащего дату “5 мая, 2006”, результатом будет целое число 4. Однако, если эти поля имеют тип даты/времени, и первое в качестве значения времени содержит значение, равное 12 часам дня (полдень), а второе — значение, равное 12 часам ночи (полночь), результатом будет дробное число 3,5.

Таким образом, вычислить, например, какое количество времени ушло на доставку товара, можно, создав следующую формулу:

{Orders.Ship Date} — {Orders.order Date}

Даже если оба указанных в этой формуле поля из базы данных будут содержать значения типа даты (или типа даты/времени, если поля были взяты из демонстрационной базы данных XTREME), результатом будет число, отображающее количество дней между этими двумя указанными датами. Эта формула возвращает число календарных дней между двумя заданными датами — она учитывает все календарные дни. Когда выполняется такой тип арифметических операций с датами, могут вернуться и дробные числа, если поля типа даты/времени содержат фактические значения времени. В этом случае разность между двумя датами может составить, скажем, 3,5 или 5,75. Это не очень удобно, когда требуется узнать просто количество дней между двумя датами, без учета времени дня. В таких случаях можно воспользоваться встроенной функцией Date, чтобы

привести тип даты/времени к типу даты. Например, возможно, для вычисления количества дней между двумя датами больше подойдет такая формула:

Date({Orders.Ship Date}) - Date({Orders.order Date})

Для получения нужного числового результата можно также воспользоваться функцией округления (Round) или усечения (Truncate). Функция Round (хоть и не разрабатывалась специально для работы с датами, но в этом примере может даже очень пригодиться) округляет число до заданного количества десятичных разрядов; округление выполняется в сторону увеличения или уменьшения, в зависимости от величины дробной части. Функция Truncate просто отбрасывает дробную часть результата, не выполняя никакого округления. А значит, она может подойти и для исключения дробных частей дат, появляющихся по причине наличия в полях даты/времени значений времени:

Truncate({Orders.Ship Date} - {Orders.order Date}, 0)

Ситуация несколько усложняется, если помимо всего выше сказанного еще требуется сделать и так, чтобы при вычислении формулы не учитывались выходные дни. Crystal Reports предлагает в обоих синтаксисах Visual Basic-подобную функцию DateDif f, которая предлагает даже еще большую степень гибкости при выполнении математических операций над датами. Пример использования функции DateDif f для исключения выходных дней из вычислений можно найти в оперативной справочной системе Crystal Reports (см. раздел “DateDiff Function” (“Функция DateDifP)).

Возможность вычисления будущих дат тоже существует. Если, например, вы хотите создать отчет для отправки пользователям, отображающий фактическую дату, до которой все счета должны быть оплачены, для вычисления самой этой даты вы можете создать специальную формулу, используя в ней дату, когда был выписан счет (поле даты), и срок оплаты (числовое поле):

(AR.INV_DATE) + (AR.TERM)

И хотя эта формула не была явно определена как формула даты, она возвращает данные типа даты, показывающие, когда истекает срок оплаты счета, при условии, что поле срока содержит количество дней, предоставленных для внесения оплаты (30, 45 и так далее).

Функция DateAdd, доступная в обоих синтаксисах формул Crystal Reports, тоже может оказаться очень полезной для вычисления как будущих, так и прошедших дат. Функция DateAdd выполняет практически все те же операции, что и ее аналог в языке Visual Basic. Например, чтобы точно определить дату на один месяц раньше текущей даты, вы могли бы воспользоваться следующей формулой:

DateAdd("m", -1, CurrentData)

Аргумент "m" обозначает интервал времени, равный месяцу. Второй аргумент обозначает количество “временных интервалов”, которые следует прибавить (в рассматриваемом случае это число отрицательное, поэтому месяц будет вычитаться). Третий аргумент — это значение даты или даты/времени, к которому будет прибавляться значение второго аргумента (функция Current Date в Crystal Reports возвращает дату, соответствующую показаниям системных часов компьютера). Главным достоинством функции DateAdd является ее способность автоматически подстраиваться под разное количество дней в месяцах и годах. Например, если бы показанная формула вычислялась 31 марта 2000 года, она бы вернула “29 февраля 2000 года” (31 февраля не существует, но 2000 год был високосным, что и привело к появлению результата “29 февраля”).

Совет. В стандартном репозитории Crystal Reports, который поставляется вместе с BusinessObjects Enterprise и Crystal Reports Sewer; содержится множество пользовательских функций, предназначенных для работы с данными типа даты. Некоторые из этих пользовательских функций автоматически исключают выходные дни из вычислений дат. Существует даже такая пользовательская функция, которую можно настроить на дни отпуска, предоставляемые работникам компании; дни отпуска, равно как и выходные, из расчетов будут исключаться. Для получения более подробной информации о том, как можно добавить эти функции в отчет, обращайтесь к главе 17.

Количество часов и минут между двумя значениями времени

Математические операции также могут выполняться и над полями времени. Когда в вычислении участвуют поля времени, результат возвращается в секундах. Например, показанная ниже формула возвратит период времени в секундах, истекший с момента начала занятия до момента его окончания, которые зафиксированы в соответствующих полях таблицы расписания из базы данных колледжа:

{COURSE.EndTime} - {COURSE.StartTime}

Если поля, содержащие значения времени, фактически имеют тип даты/времени, может потребоваться, чтобы возвращалось не количество дней между датами, а количество секунд между значениями времени. В этом случае вам придется воспользоваться встроенной функцией Time, возвращающей только ту часть поля, в которой содержится значение времени. Например:

Time({COURSE.EndTime} - {COURSE.StartTime})

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

Time(0,0,0) + ({COURSE.EndTime} - {COURSE.StartTime})

Здесь, как видите, присутствуют круглые скобки, которые указывают на то, что содержащееся внутри них выражение должно вычисляться первым. Это выражение вычисляет количество секунд между двумя значениями времени. Встроенная функция Time здесь тоже используется (правда, в несколько ином формате) и принимает три аргумента: часы, минуты и секунды. Специальным временем, возвращаемым функцией Time, является полночь. Прибавив секунды, истекшие между двумя указанными моментами времени, мы фактически получим количество часов, минут и секунд, истекших с момента наступления полуночи.

После помещения этой формулы в отчет в нем после часов, минут и секунд будут отображаться обозначения AM или PM (AM, если разница во времени не превышает 12 часов, РМ — если превышает; при условии, что в отчете используется стандартный формат даты чч: мм: с с AM/ РМ). Если требуется подавить отображение индикатора АМ/РМ, нужно будет просто открыть окно редактора Format Editor и выбрать 24-часовой формат отображения времени. Вы также можете подавить любую комбинацию часов минут и секунд, чтобы отобразить истекшее время в тех единицах, которые вам нужны.

Совет. Функция DateDif f не ограничивается только вычислением разницы между датами. С ее помощью вы запросто можете выполнить все описанные в предыдущем примере вычисления.

Функции Month, Day, Year, Hour, Minute и Second

Существует множество встроенных функций, которые могут пригодиться для работы с полями дат и времени. Например, вы можете использовать функции Month (Месяц), Day (День) и Year (Год), указывая в них в качестве аргумента поле даты или даты/времени, для извлечения из даты только значения месяца, дня или года, или функции Hour (Час), Minute (Минута) и Second (Секунда) — для извлечения только значения часов, минут или секунд.

 

Функция DateValue
Формулы If-Then-Else
Else "Обычный заказ"
Типы данных в формулах If-Then-Else
Доставка через 1 дня

Добавить комментарий


Защитный код
Обновить