Datetime 将时间函数从oracle更改为postgresql

Datetime 将时间函数从oracle更改为postgresql,datetime,postgresql-9.2,Datetime,Postgresql 9.2,我在将2号数据函数从oracle传输到postgresql时遇到问题,您能帮助我: 数据: 区间=数字(10,0) 开始日期=不带时区的时间戳 重复次数=数字(10,0) 这个表达式是我从case state复制的。我必须在postgresql中编写等价的逻辑操作 case when(摘录(从(开始日期+TRUNC(间隔时间*(重复次数-1)*7))开始的日期) -提取(当前_时间戳的日期))>=0,然后选择“确定” 第二: case when(节选)从add_months(开始)到TRUNC

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

数据:

区间=数字(10,0)

开始日期=不带时区的时间戳

重复次数=数字(10,0)

这个表达式是我从case state复制的。我必须在postgresql中编写等价的逻辑操作

case when(摘录(从(开始日期+TRUNC(间隔时间*(重复次数-1)*7))开始的日期)
-提取(当前_时间戳的日期))>=0,然后选择“确定”
第二:

case when(节选)从add_months(开始)到TRUNC(间隔)的日期*
重复次数-1)*12)-提取(从当前时间戳中提取日期)
case when(
摘录(从(开始日期+间隔时间*(重复次数-1)*间隔时间“1周”)算起的日期)
>=
摘录(从当前_时间戳算起的日期))
然后“好”
当(
摘录(从(开始日期+间隔时间*(重复次数-1)*间隔时间“1年”)算起的日期)

与ORACLE相比,PostgreSQL对的支持更好

我想(很抱歉,您没有描述这一点),您需要根据间隔将
时间戳
列与
当前时间戳
进行比较,间隔是根据列
间隔
重复
计算得出的。我还认为,在第一个例子中,你与周间隔有关,在第二个片段中与月有关。(我不完全理解
TRUNC(…)
部分代码背后的逻辑

我建议如下:

  • 重命名
    开始日期
    ,删除
    \u日期
    后缀,因为列的类型实际上是
    时间戳
    ,具有误导性
  • 间隔
    转换为
    文本
    并直接存储间隔类型,如
  • 保持
    重复
    不变,对于
    NULL
    值,默认为
    1
  • PostgreSQL本机支持
    boolean
    类型,因此您实际上不需要
    CASE…END
    构造,但这取决于应用程序
  • 因此,以下查询可以执行此操作(也可以在上执行):

    选择开始、间隔、重复、,
    开始时间+(重复时间间隔)::间隔
    >=当前\u时间戳是否正常
    从标签;
    
    为了避免猜谜游戏,请描述您的表格,并更好地描述您需要实现的目标。我只需要PostgreSql中的等效逻辑表达式。我认为对于1,这很好:选择提取(从(当前日期+间隔“1”天*TRUNC(7*(2-1)))我认为比较天数是错误的,在甲骨文中也是错误的。如果你解释一下你的逻辑,你会得到更好的结果。为什么你用*interval“1周”?而不是day?@ukaszWoźniczka,如果你能解释一下你的计算逻辑,那就容易多了。对我来说
    1周
    interval在这里看起来很自然。@ukaszWoźniczka这不是我的代码:)我是唯一的迁移人:P Java开发者不是数据库管理员。。。。
    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'