找出x分钟是否已经过去

时间:2018-04-03 20:34:42

标签: sql oracle plsql

所以,我需要知道20分钟过去了,但是,使用时间戳证明我不擅长pl / sql

这是我的查询

SELECT
systimestamp currenttime,
lockeddtts original,
lockeddtts + to_number( (
    SELECT
        value
    FROM
        configurationTable
    WHERE
        key = 'UNLOCK_TIME'
) ) * INTERVAL '1' MINUTE added20,
CASE
        WHEN systimestamp > lockeddtts + to_number( (
            SELECT
                value
            FROM
                configurationTable
            WHERE
                key = 'UNLOCK_TIME'
        ) ) * INTERVAL '1' MINUTE THEN 1
        ELSE 0
    END
    passed20
FROM
    xTable

这是我得到的结果

enter image description here

根据我的理解和我的逻辑,currentTime确实比原始时间加上20分钟,但是,oracle告诉它不是

我错过了什么?

为了使用oracle服务器时间而不是后端服务器,我正在做这个oracle明智,所以不要乱用时区,但仍然没有与我合作

编辑:

感谢@Kjetil S.的答案,我只需稍微调整一下就可以了,将日期和时间戳转换为时间戳并且正在工作

这是我的最终查询

SELECT
        CASE
            WHEN systimestamp > to_timestamp(lockeddtts + to_number( (
                SELECT
                    value
                FROM
                    configurationTable
                WHERE
                    key = 'UNLOCK_TIME'
            ) ) / ( 24 * 60 )) THEN 1
            ELSE 0
        END
    passed20
FROM
    xTable

证明它有效

enter image description here

谢谢并希望这适用于其他人

1 个答案:

答案 0 :(得分:2)

我确信interval可以某种方式使用,但我认为“经典”的Oracle方法是将天数添加到TIMESTAMPDATE列。处理分钟而不是几天时,只需要除以24 * 60,这是一天中的分钟数。类似的东西:

with c as (select value minutes from configurationTable where key='UNLOCK_TIME')
select
  systimestamp                   currenttime,
  lockeddtts                     original,
  lockeddtts+minutes/(24*60)     lockeddtts_plus_minutes,
  case when systimestamp >= lockeddtts+minutes/(24*60) then 1 else 0 end passed
from xTable,c

使用with这样可以避免两次写select ... from configurationTable