繁体   English   中英

oracle,sql date函数

[英]oracle, sql date function

我想更新我的日期列,需要增加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首先出现。

排序的几个例子是正确的,前四个是正确的,但是您可以看到最后两个的问题:

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

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

我敢打赌,您正在使用: to_char(dpdate, 'dd-MON-yyyy hh24mmss')以显示日期(该日期,或者您的NLS_DATE_FORMAT参数已使用该格式掩码更改了)-注意时间部分的mm mm用于获取月数,而您可能需要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

您确定操作正常吗?

检查此查询,它工作正常,更改了分钟:

select current_date,current_date + 35 / 86400 from dual

您可以使用INTERVAL

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

Oracle 11g它可以正常工作,并且还可以更新分钟。 与算术表达式相比,它也更易于阅读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM