0

我在将 2 数据函数从 oracle 传输到 postgresql 时遇到问题,您能帮帮我吗?

数据:

间隔 = 数字(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'

第二:

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

与 ORACLE 相比, PostgreSQL 对日期、时间和间隔类型的支持要好得多。

我猜(对不起,但你没有描述这个),你需要比较timestampcolumn 和current_timestamp基于区间的,这是从 columnsINTERVALLREPETITIONS. 我还认为,在第一种情况下,您与周间隔有关,而在第二个片段中则与月有关。(我不完全理解TRUNC(…)部分代码背后的逻辑。

我推荐以下内容:

  1. rename start_date,删除_date后缀,因为列的类型timestamp实际上具有误导性;
  2. 直接转换intervalltext并存储区间类型,如monthor week
  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 回答