【问题标题】:add time in oracle在 oracle 中添加时间
【发布时间】:2021-07-28 05:01:37
【问题描述】:
START_TIME FROM TO
01-01-2021 10:02 AM 01-01-2021 10:00 AM 01-01-2021 10:05 AM
01-01-2021 10:07 AM 01-01-2021 10:05 AM 01-01-2021 10:10 AM
02-01-2021 08:30 PM 02-01-2021 08:30 PM 02-01-2021 08:35 PM

我有一张 TIME_TABLE 表,上面有开始时间。我想再添加两列“FROM”和“TO”,它们存储 start_time 的 5 分钟间隔。我试过了,但在 Oracle db 中找不到通用的方法。

【问题讨论】:

  • 是日期还是时间戳?
  • @Rezu 它的日期格式为 DD-MM-YYYY hh24:mi:ss
  • AM 是最后一行的新列 - 这是一个错字,对吧? START_TIME 在 PM 中。
  • @mathguy 是的,很抱歉

标签: sql database oracle


【解决方案1】:

不应“存储”此类数据 - 这将公然违反第三范式。将列创建为 virtual 列(在它们被调用时动态计算),或者基于表创建一个视图,并添加这两列 - 然后无论何时您需要这些列中的数据,请从视图而不是基表中进行选择。

无论哪种方式,计算都是一样的。您应该只需要“from”列(“to”是一个微不足道的计算,将“from”增加五分钟)。

要计算“从”,取一个日期 - any 日期,我们称之为dt - 请记住,在 Oracle 中,“日期”始终表示“日期和时间”零件”。我们会将正确的时间添加到 dt 的日期部分 - from_date 的最终公式将类似于

trunc(dt) + <something>

要查找“某事”,请从dt - trunc(dt) 开始,它是“时间”组件,以天数表示。当然,它是一个介于 0 和 1 之间的数字;例如,如果一天中的时间是上午 9 点,那么这个数字就是 9/24 = 0.375。

将此数字从天(0 到 1 之间)转换为分钟(0 到 1440 之间:一天有 24 * 60 = 1440 分钟)。将结果除以 5(对于完整的五分钟间隔)并截断为整数值。多次添加“五分钟”。

最终公式:

trunc(dt) + trunc( 1440 * (dt - trunc(dt)) / 5 ) * interval '5' minute

注意1440 / 5可以简化为288,所以你也可以写

trunc(dt) + trunc( 288 * (dt - trunc(dt)) ) * interval '5' minute

简要说明:

select sysdate as start_date,
       trunc(sysdate) + trunc(288*(sysdate - trunc(sysdate))) 
                        * interval '5' minute as from_date
from   dual;

START_DATE          FROM_DATE          
------------------- -------------------
27-07-2021 11:09 PM 27-07-2021 11:05 PM

(我将计算应用于sysdate - 您将其应用于您的start_date 列。)

【讨论】:

    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    相关资源
    最近更新 更多