我需要在Oracle日期列中添加30分钟的值.我通过指定在SELECT语句中执行此操作
to_char(date_and_time + (.000694 * 31)
这在大多数时候都很好.但是当时间在AM/PM边界时.例如,向12:30
[PM] 添加30分钟将返回1:00
AM.我期待的答案是13:00
.这样做的正确方法是什么?
除了能够将日期添加到日期之外,您可以使用间隔数据类型,假设您已启用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
所有其他答案基本上都是正确的,但我认为没有人直接回答你原来的问题.
假设您的示例中的"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)).
这样可以避免舍入错误(除了浮点中固有的错误,这里没有意义)并且更清楚,至少对我而言.
来自http://www.orafaq.com/faq/how_does_one_add_a_day_hour_minute_second_to_a_date_value
SYSDATE伪列显示当前系统日期和时间.将1添加到SYSDATE将使日期提前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
UPDATE "TABLE" SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute WHERE (...)
其中interval
一个
年
月
天
小时
分钟
第二
我更喜欢使用interval
文字,因为interval '30' minute
或者interval '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