首页 > 解决方案 > 在不丢失格式的情况下更新日期时间字段的日期

问题描述

我有一个包含两列的表:(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 上进行了搜索,发现这个答案看起来几乎是我需要做的:已经回答的问题

因此,我根据我的数据调整了这个答案,并提出了如下内容:

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,但该网站对我来说已关闭(我稍后会检查是否可以将其添加到问题中)。

标签: sqloracle11g

解决方案


一种方法是:

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)

推荐阅读