Oracle сравнивает дату и час, но не минуты - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь найти пропущенные записи для задачи, которая выполняется каждый час, но иногда дает сбой.Задача создает записи с отметкой времени start_datetime.

У меня также есть таблица с каждой датой / временем для одного и того же диапазона, при этом ни одна из них не пропущена.

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

select audithour
  from lkup_audithour ahr
 where audithour <= sysdate
   and audithour not in (select start_datetime from myTable);

Но это не сработает, поскольку задача может начаться на несколько минут позже, чемначало часа, поэтому, хотя дата и час совпадают, минуты могут не совпадать.И это нормально.

То, что я придумал, ужасно, сравнивая год, месяц, день и час вручную.Есть ли лучший способ сделать это?

select audithour
  from lkup_audithour
 where audithour <= sysdate
   and audithour not in (
       select audithour
         from lkup_audithour lah
         join MyTable mt
           on extract(year from lah.audithour) = extract (year from mt.start_datetime)
          and extract(month from lah.audithour) = extract (month from mt.start_datetime)
          and extract(day from lah.audithour) = extract (day from mt.start_datetime)
          and extract(hour from cast(lah.audithour as timestamp)) = extract (hour from cast(mt.start_datetime as timestamp))
      )

Ответы [ 2 ]

3 голосов
/ 25 сентября 2019

Используйте TRUNC( date_value, 'HH' ) для усечения до начала часа:

select audithour
  from lkup_audithour ahr
 where audithour <= sysdate
   and TRUNC( audithour, 'HH' ) not in (
         select TRUNC( start_datetime, 'HH' )
         from   myTable
       );
1 голос
/ 25 сентября 2019

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

Функция TRUNC (дата) возвращает date с временной частьюдень, усеченный до единицы, указанной форматом модели fmt.

on trunc(lah.audithour, 'HH24') = trunc(mt.start_datetime, 'HH24')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...