2017-09-05 82 views
0

我想更新我的日期列,需要添加35秒。我用这个查询:oracle,sql日期函数

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排在第一位。

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 

我的问题:

的顺序由前四个是正确的,但你可以看到与去年2问题的几个例子,为什么分钟字段不更新?

回答

0

您确定您的操作正常吗?

检查此查询,它的做工精细,分钟被改变:

select current_date,current_date + 35/86400 from dual 
4

我敢打赌,你使用:to_char(dpdate, 'dd-MON-yyyy hh24mmss')显示日期(可能是,或你的NLS_DATE_FORMAT参数已更改与格式掩码) - 请注意时间部分中的mmmm用于获取月份编号,而您可能需要mi才能获得分钟。

例如为:

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 
+0

谢谢,这个作品! :)我正在使用MM而不是MI。 – jaya

0

你可以使用INTERVAL

UPDATE temp_table SET dpdate = dpdate + INTERVAL '35' SECOND; 

Oracle 11g这工作得很好,并更新分钟为好。与算术表达式相比,它也更容易阅读。