sql >> データベース >  >> RDS >> Oracle

cron式を日付/時刻形式に変換するSQLクエリ

    regexp_substrを使用できます スケジュールタプルから個々の要素を抽出する関数。例:regexp_substr(schedule, '[0-9*]+', 1,1) regexp_substr(sched, '[0-9*]+', 1, 2)が分要素を抽出しますが、 時間要素を抽出します。 4番目のパラメーターは、目的の要素を選択します。その後、EXTRACTのいずれかを使用できます またはTO_CHAR 比較のためにタイムスタンプのさまざまな部分を取得する関数。

    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;
    

    必要に応じて、caseステートメントから論理式を部分的または全体的に移動して、必要な結果を取得します。




    1. phpjson出力から改行を削除する

    2. エラー:ALTER TYPE...ADDはトランザクションブロック内で実行できません

    3. OracleのREGEXP_SUBSTR()関数

    4. Rails+PostGISエラーデータベースの移行