我想更新我的日期列,需要添加35秒。我使用了这个查询:
UPDATE temp_table SET dpdate = dpdate + 35 / 86400 ;
问题在于:
EXISTING AFTER Update
-------------------- --------------------
02-JUN-2017 02:06:13 02-JUN-2017 02:06:48
02-JUN-2017 02:06:14 02-JUN-2017 02:06:49
19-MAY-2017 02:05:47 19-MAY-2017 02:05:22
注意:我运行了上述查询,以下所有结果都是在运行该更新查询之后。
在前两行中,它工作正常,但在最后一行中,它应该来到02:06:22
,但它是02:05:22
。
按日期排序时,19-MAY-2017 02:05:47
先来,然后是19-MAY-2017 02:05:22
。
不确定为什么分钟字段没有增加,以及按顺序排列,19-MAY-2017 02:05:47
首先出现。
订购的几个例子,前四个是正确的,但你可以看到最后2个问题:
A 01-DEC-2014 12:12:00
C 01-DEC-2014 12:12:35
A 01-JUL-2016 05:07:33
C 01-JUL-2016 05:07:08
A 29-JAN-2016 04:01:08
C 29-JAN-2016 04:01:43
A 26-FEB-2016 04:02:09
C 26-FEB-2016 04:02:44
A 11-MAR-2016 03:03:13
C 11-MAR-2016 03:03:48
A 08-APR-2016 04:04:35
C 08-APR-2016 04:04:10
我的问题:为什么分钟字段没有更新?
答案 0 :(得分:4)
我敢打赌,您正在使用:to_char(dpdate, 'dd-MON-yyyy hh24mmss')
来显示日期(或者您的NLS_DATE_FORMAT参数已使用该格式掩码更改) - 请注意时间部分中的mm
。 mm
用于获取月份数,而您可能需要mi
才能获得分钟数。
E.g:
WITH sample_data AS (SELECT to_date('02-JUN-2017 02:06:13', 'dd-MON-yyyy hh24:mi:ss') dpdate FROM dual UNION ALL
SELECT to_date('02-JUN-2017 02:06:14', 'dd-MON-yyyy hh24:mi:ss') dpdate FROM dual UNION ALL
SELECT to_date('19-MAY-2017 02:05:47', 'dd-MON-yyyy hh24:mi:ss') dpdate FROM dual)
SELECT to_char(dpdate, 'dd/mm/yyyy hh24:mi:ss') dpdate,
to_char(dpdate + 35/(24*60*60), 'dd/mm/yyyy hh24:mm:ss') incorrect_new_dpdate_display,
to_char(dpdate + 35/(24*60*60), 'dd/mm/yyyy hh24:mi:ss') correct_new_dpdate_display
FROM sample_data;
DPDATE INCORRECT_NEW_DPDATE_DISPLAY CORRECT_NEW_DPDATE_DISPLAY
------------------- ---------------------------- --------------------------
02/06/2017 02:06:13 02/06/2017 02:06:48 02/06/2017 02:06:48
02/06/2017 02:06:14 02/06/2017 02:06:49 02/06/2017 02:06:49
19/05/2017 02:05:47 19/05/2017 02:05:22 19/05/2017 02:06:22
答案 1 :(得分:0)
你确定你的手术没事吗?
检查此查询,它工作正常,会议记录更改:
select current_date,current_date + 35 / 86400 from dual
答案 2 :(得分:0)
您可以使用INTERVAL
UPDATE temp_table SET dpdate = dpdate + INTERVAL '35' SECOND;
在Oracle 11g
上,这样可以正常工作,并更新会议记录。与算术表达式相比,它也更容易阅读。