oracle,sql日期函数

时间:2017-09-05 08:59:31

标签: sql oracle

我想更新我的日期列,需要添加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

我的问题:为什么分钟字段没有更新?

3 个答案:

答案 0 :(得分:4)

我敢打赌,您正在使用:to_char(dpdate, 'dd-MON-yyyy hh24mmss')来显示日期(或者您的NLS_DATE_FORMAT参数已使用该格式掩码更改) - 请注意时间部分中的mmmm用于获取月份数,而您可能需要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上,这样可以正常工作,并更新会议记录。与算术表达式相比,它也更容易阅读。