sql >> Databáze >  >> RDS >> Oracle

SQL Query pro převod výrazu cron do formátu data/času

Můžete použít regexp_substr funkce pro extrahování jednotlivých prvků z plánovací n-tice. Například regexp_substr(schedule, '[0-9*]+', 1,1) extrahuje prvek minuty, zatímco regexp_substr(sched, '[0-9*]+', 1, 2) vyjme prvek hodiny. 4. parametr vybírá požadovaný prvek. Poté můžete použít buď EXTRACT nebo TO_CHAR funkce, abyste získali různé části vašeho časového razítka pro srovnání.

with cron(ID, Sched) as (
  select 102, '00 9 * * * *' from dual
), exec(id, ts) as (
  select 102, to_timestamp('2017-11-05 9:00:00', 'yyyy-mm-dd hh24:mi:ss') from dual union all
  select 102, to_timestamp('2017-11-05 9:05:00', 'yyyy-mm-dd hh24:mi:ss') from dual
), c2 as (
select id
     , sched 
     , regexp_substr(sched,'[0-9*]+',1,1) min
     , regexp_substr(sched,'[0-9*]+',1,2) hour
     , regexp_substr(sched,'[0-9*]+',1,3) day
     , regexp_substr(sched,'[0-9*]+',1,4) mon
     , regexp_substr(sched,'[0-9*]+',1,5) wday
     , regexp_substr(sched,'[0-9*]+',1,6) year
  from cron
)
select c2.*
     , exec.ts
     , case when (year = '*' or to_number(to_char(ts,'yyyy')) = to_number(year))
             and (mon  = '*' or to_number(to_char(ts,'mm')  ) = to_number(mon ))
             and (day  = '*' or to_number(to_char(ts,'dd')  ) = to_number(day ))
             and (hour = '*' or to_number(to_char(ts,'hh24')) = to_number(hour))
             and (min  = '*' or to_number(to_char(ts,'mi')  ) = to_number(min ))
             and (wday = '*' or to_number(to_char(ts,'d')   ) = to_number(wday))
            then 'OK'
            else 'KO'
       end Match
  from exec 
  join c2 
    on c2.id = exec.id;

přesuňte logický výraz z příkazu case částečně nebo celý podle potřeby, abyste získali požadované výsledky.




  1. TIMESTAMP znamená?

  2. Jak vrátit tabulku pomocí funkce mysql

  3. Vyjmout řetězec po prvním výskytu znaku

  4. Nejlepší způsoby, jak opravit poškozenou tabulku InnoDB v MySQL