我从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'
答案 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(…)
部分背后的逻辑。
我建议如下:
start_date
,删除_date
后缀,因为列的类型实际上是timestamp
,具有误导性; intervall
转换为text
并直接存储间隔类型,例如month
或week
; repetitions
不变,默认为1
NULL
值; boolean
类型,因此您不需要CASE … END
构造,具体取决于应用程序。因此,以下查询可以执行此操作(也在SQL Fiddle上):
SELECT start_dt, intervall, repetition,
start_dt + (repetition||intervall)::interval
>= current_timestamp AS is_it_ok
FROM tab;