Maximo UI SQL Выберите месяц - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь написать запрос с использованием SQL в функции расширенного поиска пользовательского интерфейса Maximo 7.5, которая будет возвращать данные за месяц, предшествующий месяцу, в котором был выполнен запрос.Я хочу сохранить этот запрос и сделать его доступным для пользователей, которые будут выполнять запрос, не редактируя его.Например, если пользователь запустил сохраненный запрос 25.01.2009, запрос вернет все записи, для которых дата была любым днем ​​декабря 2018 года. Ранее я использовал «где actfinish> = sysdate-30», но длинаколичество месяцев варьируется, и я не могу полагаться на то, что пользователи (которые не пишут SQL) всегда будут запускать запрос в первый день каждого месяца, поэтому мне нужно отфильтровать запрос по предыдущему месяцу.Поле, по которому я фильтрую, является полем ДАТА, но в БД оно выглядит как DD-MMM-YY.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Ранее я использовал "где actfinish> = sysdate-30", но длина в месяцах меняется.

Под "длиной месяца" вы подразумеваете количество дней длякаждый месяц (например, 30, 31, 28, 29) или просто проблема форматирования с месяцем?Если я правильно понял ваш вопрос, вы можете преобразовать дату в символ, а затем преобразовать ее в дату, и Oracle позаботится об изменении количества дней.Например, что-то вроде:

где to_date (to_char (actfinish, 'mm / dd / yyyy'))> = to_date (to_char (sysdate, 'mm / dd / yyyy')) - 30

или

где to_date (to_char (actfinish), 'mm / dd / yyyy')> = to_date (to_char (sysdate), 'mm / dd / yyyy') -30

У меня не установлен Maximo на моем персональном ноутбуке, поэтому вы можете попробовать два, перечисленных выше.

0 голосов
/ 25 января 2019

Ваш текущий where actfinish >= sysdate-30 вернет данные за текущий месяц, а также проблемы, которые вы упомянули.

Вы можете сделать что-то вроде:

where actfinish >= add_months(trunc(sysdate, 'MM'), -1)
and actfinish < trunc(sysdate, 'MM')

trunc(sysdate, 'MM') даетВы полночь в первый день текущего месяца.Первый пункт вычитает месяц из этого, поэтому дает вам полночь в первый день предыдущего месяца;второе предложение запрещает включение любой записи за этот месяц.

Вы можете проверить, что они оценивают, запросив термины вне вашего реального запроса:

alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS';

select sysdate,
  add_months(trunc(sysdate, 'MM'), -1) as month_from,
  trunc(sysdate, 'MM') as month_to
from dual;

SYSDATE             MONTH_FROM          MONTH_TO           
------------------- ------------------- -------------------
2019-01-25 12:59:53 2018-12-01 00:00:00 2019-01-01 00:00:00

alter session просто длязаставить клиента форматировать результаты определенным образом, вместо того, чтобы явно делать to_char().

Когда вы сказали «в БД это выглядит как DD-MMM-YY», на самом деле это не выглядит такв базе данных;когда вы запрашиваете значения даты, ваш клиент форматирует даты подобным образом, поэтому ваш NLS_DATE_FORMAT, вероятно, будет установлен в модель DD-MON-RR по-прежнему по умолчанию.(И в Oracle это MON, а не MMM - см. элементы модели формата в документации .)

...