将时间函数从oracle更改为postgresql



我在从oracle到postgresql的transfer 2数据函数上遇到问题,你能帮我吗:

数据:

INTERWALL=数字(10,0)

START_DATE=不带时区的时间戳

重复=数字(10,0)

这个表达式是我从case state复制的。我必须在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'
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'
与ORACLE相比,PostgreSQL对日期、时间和间隔类型的支持要好得多。

我想(对不起,但您还没有描述这一点),您需要根据根据列INTERVALLREPETITIONS计算的间隔来比较timestamp列和current_timestamp列。我还认为,在第一种情况下,您与第二个片段中的周间隔和月有关。(我不完全理解代码TRUNC(…)部分背后的逻辑。

我建议如下:

  1. 重命名start_date,去掉_date后缀,因为列的类型实际上是timestamp,具有误导性
  2. intervall转换为text,直接存储区间类型,如monthweek
  3. 保持repetitions不变,NULL值默认为1
  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;

相关内容

  • 没有找到相关文章

最新更新