Oracle:如何在时间戳中添加分钟?

Posted

技术标签:

【中文标题】Oracle:如何在时间戳中添加分钟?【英文标题】:Oracle: how to add minutes to a timestamp? 【发布时间】:2010-09-20 09:59:20 【问题描述】:

我需要将 30 分钟添加到 Oracle 日期列中的值。我通过指定

在我的 SELECT 语句中执行此操作

to_char(date_and_time + (.000694 * 31)

大部分时间都可以正常工作。但不是当时间在上午/下午边界时。例如,将 30 分钟添加到 12:30 [即 PM] 将返回 1:00,即 AM。我期望的答案是13:00。这样做的正确方法是什么?

【问题讨论】:

【参考方案1】:

除了可以将天数添加到日期之外,您还可以使用间隔数据类型(假设您在 Oracle 9i 或更高版本),这可能更容易阅读,

SQL> ed
Wrote file afiedt.buf
SELECT sysdate, sysdate + interval '30' minute FROM dual
SQL> /

SYSDATE              SYSDATE+INTERVAL'30'
-------------------- --------------------
02-NOV-2008 16:21:40 02-NOV-2008 16:51:40

【讨论】:

+1 哇,我从来不知道...我终于可以放弃一天中可笑的部分了! 这真的很有帮助,考虑到它收到的赞成票,这可能应该是公认的答案。 我正在寻找的答案。非常感谢这个(***.com/questions/257324/…)评论指出了这个答案! 这是一个很好的答案,但我个人认为jtomaszk's answer 更清楚,更中肯。 @Homer - 我不确定我是否理解。如果您的参数是interval,它的行为方式应该相同。如果您要传入一个数字和/或一个单位,您可能希望使用 numToDSInterval 函数来构造区间,而不是使用区间文字语法。【参考方案2】:

所有其他答案基本上都是正确的,但我认为没有人直接回答你原来的问题。

假设您的示例中的“date_and_time”是一个类型为 DATE 或 TIMESTAMP 的列,我认为您只需要更改它:

to_char(date_and_time + (.000694 * 31))

到这里:

to_char(date_and_time + (.000694 * 31), 'DD-MON-YYYY HH24:MI')

听起来您的默认日期格式使用“HH”代码表示小时,而不是“HH24”。

另外,我认为您的常量术语既令人困惑又不精确。我猜你所做的是计算 (.000694) 大约是一分钟的值,然后将它乘以要添加的分钟数(示例中为 31,尽管你在文本中说 30)。

我也会从一天开始,并将其划分为您想要在代码中使用的单元。在这种情况下,(1/48) 将是 30 分钟;或者如果您想为了清楚起见将其分解,您可以写成 ( (1/24) * (1/2) )。

这将避免舍入错误(除了那些在此处应该毫无意义的浮点固有的错误)并且更清晰,至少对我而言。

【讨论】:

别忘了看看下面有 40 多个评分的答案 :) 我对此表示反对。虽然一般来说很实用,但总有可能出现:1) 舍入错误,2) 夏令时错误和其他日期/时间警告,3) 它比实际间隔计算更难维护。 @KalpeshSoni 感谢您指出存在更好的解决方案:) 我想Justin Cave's answer 是您指的那个?【参考方案3】:
UPDATE "TABLE" 
SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute 
WHERE (...)

interval 是其中之一

年份 月 天 小时 分钟 第二个

【讨论】:

这行得通 :) 你的答案比Interval Literals for 11g上的 Oracle 文档更容易阅读【参考方案4】:

来自http://www.orafaq.com/faq/how_does_one_add_a_day_hour_minute_second_to_a_date_value

SYSDATE 伪列显示当前系统日期和时间。向 SYSDATE 添加 1 将使日期提前 1 天。使用分数将小时、分钟或秒添加到日期

SQL> select sysdate, sysdate+1/24, sysdate +1/1440, sysdate + 1/86400 from dual;

SYSDATE              SYSDATE+1/24         SYSDATE+1/1440       SYSDATE+1/86400
-------------------- -------------------- -------------------- --------------------
03-Jul-2002 08:32:12 03-Jul-2002 09:32:12 03-Jul-2002 08:33:12 03-Jul-2002 08:32:13

【讨论】:

【参考方案5】:

我更喜欢为此使用 interval 文字,因为 interval '30' minuteinterval '5' second30 / (24 * 60)5 / (24 * 60 * 69) 更容易阅读

例如

some_date + interval '2' hour some_date + interval '30' minute some_date + interval '5' second some_date + interval '2' day

您也可以将多个单位组合成一个表达式:

some_date + interval '2 3:06' day to minute

将日期值加上 2 天 3 小时 6 分钟

以上也是标准 SQL,也适用于其他几个 DBMS。

手册中的更多详细信息:https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF00221

【讨论】:

完美解决方案【参考方案6】:

如果字段的数据类型是日期或时间戳,如果您添加以天数给出的正确数字(或者在您的情况下是正确的一天的小数部分),Oracle 应该始终给出正确的结果。所以如果你想在 30 分钟内提高价值,你应该使用:

select field + 0.5/24 from table;

根据您提供的信息,我相信这是您尝试做的,我很确定它有效。

【讨论】:

上面没有使用 to_char 的答案只提供了默认格式,例如:04-NOV-08。这不是我想要的。【参考方案7】:

我们可以不用这个吗

SELECT date_and_time + INTERVAL '20:00' MINUTE TO SECOND FROM dual;

我是这个领域的新手。

【讨论】:

【参考方案8】:

确保 Oracle 了解开始时间是 PM,并为最终输出指定 HH24 格式掩码。

SELECT to_char((to_date('12:40 PM', 'HH:MI AM') + (1/24/60) * 30), 'HH24:MI') as time
  FROM dual

TIME
---------
13:10

注意:HH:MI 中的 'AM' 只是 AM/PM 子午线指示器的占位符。也可以是'PM'

【讨论】:

【参考方案9】:

很容易就这样

我将系统日期增加了 10 分钟,并且始终优先使用 Db 服务器功能而不是自定义功能。

select to_char(sysdate + NUMTODSINTERVAL(10,'MINUTE'),'DD/MM/YYYY HH24:MI:SS') from dual;

【讨论】:

【参考方案10】:

根据您的要求,您需要 to_char 的 HH24:MI 格式。

【讨论】:

【参考方案11】:

要在 oracle 中编辑日期,您可以尝试

  select to_char(<columnName> + 5 / 24 + 30 / (24 * 60),
           'DD/MM/RRRR hh:mi AM') AS <logicalName> from <tableName>

【讨论】:

5 / 24 5 小时,30 / (24 * 60) 30 分钟。【参考方案12】:

Oracle 现在有新的内置函数来执行此操作:

select systimestamp START_TIME, systimestamp + NUMTODSINTERVAL(30, 'minute') end_time from dual

【讨论】:

【参考方案13】:
SELECT to_char(sysdate + (1/24/60) * 30, 'dd/mm/yy HH24:MI am') from dual;

您可以将它与各种日期格式一起使用....

【讨论】:

为什么要使用HH24格式的反经线?

以上是关于Oracle:如何在时间戳中添加分钟?的主要内容,如果未能解决你的问题,请参考以下文章

将日期添加到时间戳

如何在 mysql PDO 选择查询中仅从时间戳中选择时间?

如何使用 pyspark 从 aws 胶水的时间戳中提取年份

如何在sequelize ORM中使用从时间戳中选择并提取日期到月份和年份?

我应该在我的 Bigtable 单元格时间戳中添加啥?

如何从R中具有月份名称的时间戳中提取日期