我在从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'
我想(对不起,但您还没有描述这一点),您需要根据根据列INTERVALL
和REPETITIONS
计算的间隔来比较timestamp
列和current_timestamp
列。我还认为,在第一种情况下,您与第二个片段中的周间隔和月有关。(我不完全理解代码TRUNC(…)
部分背后的逻辑。
我建议如下:
- 重命名
start_date
,去掉_date
后缀,因为列的类型实际上是timestamp
,具有误导性 - 将
intervall
转换为text
,直接存储区间类型,如month
或week
- 保持
repetitions
不变,NULL
值默认为1
- PostgreSQL本机支持
boolean
类型,所以这里并不需要CASE … END
构造,这取决于应用程序
因此,以下查询可以做到这一点(也可以在SQL Fiddle上):
SELECT start_dt, intervall, repetition,
start_dt + (repetition||intervall)::interval
>= current_timestamp AS is_it_ok
FROM tab;