0

Oracle から Postgresql への転送 2 データ関数に問題があります。

データ:

間隔 = 数値 (10,0)

START_DATE = タイムゾーンなしのタイムスタンプ

繰り返し = 数値 (10,0)

この式は、ケースの状態からコピーします。postgresql で同等の論理アクションを作成する必要があります。

 case when (extract(DAY FROM (START_DATE + TRUNC(INTERVALL*(REPETITIONS-1) * 7)))
   - extract(DAY FROM CURRENT_TIMESTAMP)) >= 0 then 'OK'

そして2番目:

case when (extract(DAY FROM add_months(START_DATE, TRUNC(INTERVALL*
  REPETITIONS-1) * 12))) - extract(DAY FROM CURRENT_TIMESTAMP)) <= 0 then 'ok'
4

2 に答える 2

1
case when (
    extract(DAY FROM (START_DATE + INTERVALL * (REPETITIONS - 1) * interval '1 week'))
    >=
    extract(DAY FROM CURRENT_TIMESTAMP))
then 'OK'

case when (
    extract(DAY FROM (START_DATE + INTERVALL * (REPETITIONS - 1) * interval '1 year')))
    <= extract(DAY FROM CURRENT_TIMESTAMP))
then 'ok'
于 2013-02-21T22:47:11.517 に答える
0

PostgreSQL は、ORACLE と比較して、日付、時刻、および間隔タイプのサポートがはるかに優れています。

(申し訳ありませんが、これについて説明していません)、列とから計算される間隔に基づいて、timestamp列 を と比較する必要があると思います。また、最初のケースでは週間隔と関係があり、2 番目のスニペットでは月に関係があると思います。(あなたのコードの一部の背後にあるロジックを完全には理解していません。current_timestampINTERVALLREPETITIONSTRUNC(…)

次のことをお勧めします。

  1. rename 、列のタイプが実際には誤解を招くため、接尾辞start_dateを削除します。_datetimestamp
  2. orのように、間隔型に変換intervallしてtext直接保存します。monthweek
  3. そのままrepetitionsにして、デフォルト1NULL値を設定します。
  4. PostgreSQL はboolean型をネイティブにサポートしているため、ここでの構成は実際には必要ありませんがCASE … END、アプリケーションによって異なります。

したがって、次のクエリで実行できます(SQL Fiddleでも):

SELECT start_dt, intervall, repetition,
       start_dt + (repetition||intervall)::interval
         >= current_timestamp AS is_it_ok
  FROM tab;
于 2013-02-21T22:53:06.273 に答える