如何修改Oracle Timestamp的日期部分且保留时间部分
替换Oracle TIMESTAMP列的日期部分(保留时间)
嘿,我明白你想要替换TIMESTAMP列的日期部分但保留时间的需求——你原来用加天数的方法确实能行,但确实不够直观,还得靠工具算天数,挺麻烦的。这里有两个更直观、可读性更强的方法,完全不用手动计算天数:
方法一:利用日期间隔运算(推荐,支持毫秒)
这个方法能完整保留原时间的所有细节(包括毫秒,如果有的话),逻辑也很清晰:
UPDATE mytable SET tscolumn = TO_TIMESTAMP('2020-06-08', 'YYYY-MM-DD') + (tscolumn - TRUNC(tscolumn)) WHERE -- 你的筛选条件,比如 tscolumn >= TO_TIMESTAMP('2019-11-05', 'YYYY-MM-DD')
原理说明:
TRUNC(tscolumn):把原TIMESTAMP的日期部分截断,得到2019-11-05 00:00:00tscolumn - TRUNC(tscolumn):计算出原时间和截断后日期的时间间隔,也就是0 15:16:31.000000(如果有毫秒会自动保留)- 最后把这个时间间隔加到目标日期转换的TIMESTAMP上,就得到了
2020-06-08 15:16:31(含原毫秒)
方法二:字符串拼接法(适合简单场景)
如果你的TIMESTAMP没有毫秒,或者不需要保留毫秒,用字符串拼接的方式逻辑更直白:
UPDATE mytable SET tscolumn = TO_TIMESTAMP( '2020-06-08 ' || TO_CHAR(tscolumn, 'HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS' ) WHERE -- 你的筛选条件
原理说明:
TO_CHAR(tscolumn, 'HH24:MI:SS'):把原时间的时分秒部分转成字符串15:16:31- 和目标日期字符串
2020-06-08拼接后,得到完整的时间字符串2020-06-08 15:16:31 - 最后用
TO_TIMESTAMP把字符串转回TIMESTAMP类型
和你原有方法的对比
你原来的tscolumn + 216方法虽然可行,但有两个明显缺点:
- 必须手动计算两个日期的天数差,容易因闰年、不同月份天数差异算错
- 代码可读性差,其他维护者看到
+216很难立刻明白意图
上面两种方法直接指定目标日期,逻辑清晰,后期维护起来更省心。
额外注意
如果你的TIMESTAMP包含毫秒,方法二需要调整格式字符串,把HH24:MI:SS改成HH24:MI:SS.FF,这样就能保留毫秒部分了。
内容的提问来源于stack exchange,提问作者Rich
相关产品推荐
相关产品推荐

