将时间函数从oracle更改为postgresql

时间:2013-02-21 21:35:34

标签: datetime postgresql-9.2

我从oracle到postgresql的转移2数据功能有问题你可以帮助我:

数据:

INTERVALL =数字(10,0)

START_DATE =没有时区的时间戳

REPETITIONS = numeric(10,0)

此表达式我从案例状态复制。我必须在postgresql中编写等效的逻辑操作。

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

和第二:

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

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分:0)

与ORACLE相比,PostgreSQL更好地支持date, time and interval types

我猜(抱歉,但您没有说明这一点),您需要根据时间间隔timestamp列与current_timestamp进行比较,该时间间隔是根据INTERVALL列计算的和REPETITIONS。我还认为,在第一种情况下,您与周间隔有关,而在第二个片段中有几个月。 (我不完全理解代码TRUNC(…)部分背后的逻辑。

我建议如下:

  1. 重命名start_date,删除_date后缀,因为列的类型实际上是timestamp,具有误导性;
  2. intervall转换为text并直接存储间隔类型,例如monthweek;
  3. 保持repetitions不变,默认为1 NULL值;
  4. PostgreSQL原生支持boolean类型,因此您不需要CASE … END构造,具体取决于应用程序。
  5. 因此,以下查询可以执行此操作(也在SQL Fiddle上):

    SELECT start_dt, intervall, repetition,
           start_dt + (repetition||intervall)::interval
             >= current_timestamp AS is_it_ok
      FROM tab;