Функция Oracle для минимально возможной даты

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

FUNCTION GetFilmCount(customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE)
RETURN INTEGER;    

FUNCTION GetFilmCount(customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE, begin_date_in IN DATE, end_date_in IN DATE)
RETURN INTEGER;

Чтобы уменьшить дублирование кода, я хочу вызвать вторую функцию из первой. Для end_date_in я могу передать SYSDATE, но есть ли функция Oracle для передачи минимально возможной даты для begin_date_in (<> в следующем коде) без запроса таблицы КЛИЕНТ?

FUNCTION GetFilmCount(customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE)
RETURN INTEGER IS
BEGIN
  RETURN GetFilmCount(customer_id_in, <> ,SYSDATE);
END;

В Oracle есть абсолютная «самая ранняя» дата (до н.э., несколько тысяч лет назад). Но зачем вам это приложение для этого приложения? У вас ведь в 1300 году нет арендной платы? Поэтому используйте 1 января 1300 г. в качестве значения по умолчанию для begin_date.

mathguy 14.11.2018 23:38

Кстати, вам не нужны две функции. Вы можете сделать второй и третий параметры второй функции необязательными, задав им значения по умолчанию. Затем, если функция вызывается только с одним параметром, будет вызвана та же функция (второй) со значениями по умолчанию begin_date и end_date.

mathguy 14.11.2018 23:40

Вместо "минимально возможной даты" я бы использовал NULL.

Wernfried Domscheit 15.11.2018 08:39

Вам нужна только одна функция, например: FUNCTION GetFilmCount(customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE, begin_date_in IN DATE DEFAULT NULL, end_date_in IN DATE DEFAULT SYSDATE) RETURN INTEGER;

Wernfried Domscheit 15.11.2018 08:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
134
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Минимальное значение переменной DATE в Oracle - 1 января 4712 г. до н.э., поэтому следующее даст вам максимальный диапазон до SYSDATE включительно:

RETURN GetFilmCount(customer_id_in, TO_DATE('01-Jan-4712 BC', 'DD-MON-YYYY BC'), SYSDATE);

Удачи.

Ответ принят как подходящий

Используйте NULL для "неопределенных" значений, а не для какого-то магического числа:

FUNCTION GetFilmCount(
  customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE
)
RETURN INTEGER IS
BEGIN
  RETURN GetFilmCount(customer_id_in, NULL ,SYSDATE);
END;

и

FUNCTION GetFilmCount(
  customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE,
  begin_date_in  IN DATE,
  end_date_in    IN DATE
)
RETURN INTEGER IS
  p_count NUMBER;
BEGIN
  SELECT COUNT(*)
  INTO   p_count
  FROM   your_table
  WHERE  customer_id = customer_id_in
  AND    ( begin_date_in IS NULL OR begin_date_in    <= your_date_column )
  AND    ( end_date_in   IS NULL OR your_date_column <= end_date_in );

  RETURN p_count;
END;

Другие вопросы по теме