我有一个包含两列的表: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,但是该网站对我来说已经关闭(我稍后会检查是否可以将其添加到问题中)。
答案 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)