在datetime字段中更新日期,而不会丢失格式

时间:2018-09-28 11:57:33

标签: sql oracle11g

我有一个包含两列的表:M_OP_DATE(类型为DATE)和M__DT_UTC_DATE(类型为TIMESTAMP(3))。 该表包含以下数据:

+---------------------+---------------------+
|      M_OP_DATE      |   M__DT_UTC_DATE    |
+---------------------+---------------------+
| 2018-09-03 00:00:00 | 2018-09-25 20:14:57 |
| 2018-08-31 00:00:00 | 2018-09-25 20:15:05 |
| 2018-08-31 00:00:00 | 2018-09-25 20:15:05 |
+---------------------+---------------------+

我想在M_OP_DATE字段中复制M__DT_UTC_DATE中的日期,而无需触摸时间。

我已经搜索了SO,发现了这个答案,看起来几乎是我需要做的:already answered question

因此,我根据数据修改了该答案,并提出了类似这样的内容:

update FXKAUD_H_DBF set M__DT_UTC_DATE = to_date(substr(M_OP_DATE, 0, 9) || ' ' || to_char(M__DT_UTC_DATE, 'HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS')

但是,结果不是预期的:

+---------------------+---------------------+
|      M_OP_DATE      |   M__DT_UTC_DATE    |
+---------------------+---------------------+
| 2018-08-29 00:00:00 | 2029-08-18 14:47:07 |
+---------------------+---------------------+

如您所见,年份为2029,日期为18。它基本上将日期的两位数字与年份的最后两位数字交换。

当我尝试仅选择substr(M_OP_DATE, 0, 9)内的内容时,可以看到结果与通过简单选择在表中看到的结果有所不同:

select substr(M_OP_DATE, 0, 9) from FXKAUD_H_DBF

+-----------------------+
| SUBSTR(M_OP_DATE,0,9) |
+-----------------------+
| 29-AUG-18             |
+-----------------------+ 

...并且是我尝试将此字符串格式化为YYYY-MM-DD格式的日期时出现的问题:

select to_date(substr(M_OP_DATE, 0, 9), 'YYYY-MM-DD') from FXKAUD_H_DBF

| TO_DATE(SUBSTR(M_OP_DATE,0,9),'YYYY-MM-DD') |
+---------------------------------------------+
| 0029-08-18 00:00:00                         |
+---------------------------------------------+

有人可以指导我采取好的方法吗? 抱歉,没有提供SQLfiddle,但是该网站对我来说已经关闭(我稍后会检查是否可以将其添加到问题中)。

1 个答案:

答案 0 :(得分:1)

一种方法是:

select M_OP_DATE + (M__DT_UTC_DATE - trunc(M__DT_UTC_DATE))

或者:

select M__DT_UTC_DATE - (trunc(M__DT_UTC_DATE) - M_OP_DATE

查询将是:

update FXKAUD_H_DBF set M__DT_UTC_DATE = M__DT_UTC_DATE - (trunc(M__DT_UTC_DATE) - M_OP_DATE)