gpt4 book ai didi

带有格式的 oracle to_date 不显示时间

转载 作者:行者123 更新时间:2023-12-05 06:41:15 27 4
gpt4 key购买 nike

我有简单的计算,我用时间从日期中减去间隔:

 select TO_DATE('2016-12-05 23:04:59', 'YYYY-MM-DD HH24:MI:SS')  - to_dsinterval('00 0:05:00') from dual;

运行正常,结果:2016-12-05 22:59:59

但它不能正确处理时区,所以下一个方法解决了时区问题。我只是用 to_date() 再包装一次表达式

select TO_DATE(
TO_DATE('2016-12-05 23:04:59', 'YYYY-MM-DD HH24:MI:SS') - to_dsinterval('00 0:05:00')) from dual;

但现在它把时间归零了。结果应为:2016-12-05 22:59:59 但实际为:2016-12-05 00:00:00

如果我像这样将格式添加到外部 to_date:

select to_date( TO_DATE('2016-12-05 23:04:59', 'YYYY-MM-DD HH24:MI:SS') - to_dsinterval('00 0:05:00'), 'YYYY-MM-DD HH24:MI:SS') from dual;

结果变得很奇怪:0005-12-16 00:00:00我做错了什么?

最佳答案

DATE 数据类型不支持任何时区功能,您必须为此使用 TIMESTAMP WITH TIME ZONE

您的问题

SELECT TO_DATE( TO_DATE('2016-12-05 23:04:59', 'YYYY-MM-DD HH24:MI:SS') - TO_DSINTERVAL('00 0:05:00'), 'YYYY-MM-DD HH24:MI:SS') 
FROM dual;

做以下事情:

  1. 创建一个DATE '2016-12-05 23:04:59'
  2. 减去区间'00 0:05:00'
  3. 转换为 VARCHAR2(使用 NLS_DATE_FORMAT 格式)
  4. 使用 YYYY-MM-DD HH24:MI:SS 格式转换为 DATE

如果您的 NLS_DATE_FORMAT 等于 YYYY-MM-DD HH24:MI:SS 此查询返回正确的输出。

使用这个:

SELECT TO_TIMESTAMP('2016-12-05 23:04:59', 'YYYY-MM-DD HH24:MI:SS') - TO_DSINTERVAL('00 0:05:00')
FROM dual;

TO_DATE(... 也可以。如果您需要时区支持,您必须:

SELECT TO_TIMESTAMP_TZ('2016-12-05 23:04:59 Europe/Berlin', 'YYYY-MM-DD HH24:MI:SS TZR') - TO_DSINTERVAL('00 0:05:00')
FROM dual;

关于带有格式的 oracle to_date 不显示时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40976391/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com