44

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

to_char(date_and_time + (.000694 * 31)

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

4

13 回答 13

138

除了能够将天数添加到日期之外,您还可以使用间隔数据类型(假设您在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
于 2008-11-02T21:22:38.887 回答
30

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

假设您的示例中的“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) )。

这将避免舍入错误(除了浮点中固有的那些在这里应该没有意义的错误)并且更清晰,至少对我来说。

于 2008-11-03T12:59:46.220 回答
18
UPDATE "TABLE" 
SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute 
WHERE (...)

其中interval之一在哪里

  • 小时
  • 分钟
  • 第二
于 2013-06-11T08:22:50.590 回答
12

来自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
于 2010-02-22T13:14:26.290 回答
12

interval我更喜欢为此使用文字,因为interval '30' minuteorinterval '5' second更容易阅读30 / (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

于 2016-11-07T07:22:15.413 回答
3

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

select field + 0.5/24 from table;

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

于 2008-11-02T20:48:55.133 回答
3

我们可以不用这个吗

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

我是这个领域的新手。

于 2010-12-01T21:31:12.160 回答
1

确保 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

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

于 2008-11-02T20:47:57.443 回答
1

很容易就喜欢这样

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

select to_char(sysdate + NUMTODSINTERVAL(10,'MINUTE'),'DD/MM/YYYY HH24:MI:SS') from dual;
于 2018-12-16T21:39:01.703 回答
0

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

于 2008-11-03T00:46:50.410 回答
0

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

  select to_char(<columnName> + 5 / 24 + 30 / (24 * 60),
           'DD/MM/RRRR hh:mi AM') AS <logicalName> from <tableName>
于 2015-11-07T06:56:13.257 回答
0

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

select systimestamp START_TIME, systimestamp + NUMTODSINTERVAL(30, 'minute') end_time from dual
于 2020-09-11T20:59:38.363 回答
-1
SELECT to_char(sysdate + (1/24/60) * 30, 'dd/mm/yy HH24:MI am') from dual;

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

于 2012-01-11T05:31:07.053 回答