代码之家  ›  专栏  ›  技术社区  ›  Matteo NNZ

在不丢失格式的情况下更新date on datetime字段

  •  1
  • Matteo NNZ  · 技术社区  · 8 年前

    我有一个有两列的表: 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 |
    +---------------------+---------------------+
    

    我想把日期从 操作日期 ,不碰时间,在田野里 UTC日期

    我搜索了这么多,找到了这个答案,这看起来和我需要做的差不多: 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 回复  |  直到 8 年前
        1
  •  1
  •   Matteo NNZ    8 年前

    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)
    
    推荐文章