SQL для проверки текущей даты в столбце типа string, в котором хранится дата в формате MMDD, не старше 120 дней - PullRequest
0 голосов
/ 28 октября 2018

В таблице Oracle в моем приложении есть столбец с именем «action_date »типа string.Дата хранится в формате MMDD, где MM = месяц, а DD = день.

Пожалуйста, помогите мне написать оператор SQL, который будет сравнивать столбец транзакции_даты с текущей системной датой, если дата транзакции меньше или равнадо 120 дней, затем извлеките записи из таблицы.

Проблема, с которой я сталкиваюсь, заключается в том, что для транзакции транзакции в базе данных не указывается год только как месяц и день в качестве строкового значения, так как проверить, не является ли это значениеболее 120 дней, эта проверка должна работать, если значение в столбце соответствует предыдущему году.Например, SQL должен работать для сценария, в котором текущая системная дата, скажем, 01 февраля 2018 г., а столбец транзакции в таблице имеет значение «1225» (25 декабря предыдущего года).

1 Ответ

0 голосов
/ 28 октября 2018

Как общий отказ от ответственности, ваш текущий дизайн таблицы является неоптимальным, потому что a) вы сохраняете даты в виде текста, и b) вы даже не сохраняете год для каждой даты. Из того, что вы написали, похоже, что вы хотите считать все данные за последние год, начиная с текущей даты.

Здесь можно попробовать один трюк - сравнить текст MMDD для каждой записи в вашей таблице с TO_CHAR(SYSDATE, 'MMDD'), используя следующую логику:

  • Если MMDD на меньше , чем или равно сегодняшнему, тогда ему присваивается текущий год (2018 на момент написания этого ответа)
  • Если MMDD на больше , чем сегодня, тогда ему присваивается предыдущий год (2017).

Затем мы можем строить даты для каждой записи, используя соответствующий год, и проверять, находится ли она в пределах 120 дней с SYSDATE.

WITH yourTable AS (
    SELECT '0101' AS date_col FROM dual UNION ALL
    SELECT '1001' FROM dual UNION ALL
    SELECT '1027' FROM dual UNION ALL
    SELECT '1215' FROM dual
)

SELECT
    date_col
FROM yourTable
WHERE
    (date_col <= TO_CHAR(SYSDATE, 'MMDD') AND
     TO_DATE(date_col || TO_CHAR(SYSDATE, 'YYYY'), 'MMDDYYYY') >= SYSDATE - 120) OR
    (date_col > TO_CHAR(SYSDATE, 'MMDD') AND
     TO_DATE(date_col ||
         TO_CHAR(TRUNC(ADD_MONTHS(SYSDATE, -12), 'YEAR'), 'YYYY'), 'MMDDYYYY') >=
         SYSDATE - 120);

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...