oracle to_日期格式不显示时间

oracle to_日期格式不显示时间,oracle,format,intervals,to-date,Oracle,Format,Intervals,To Date,我有一个简单的计算,我用时间减去日期的间隔: 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',

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

 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

如果我将格式添加到外部截止日期,如下所示:

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

接受VARCHAR2参数

执行TO_DATE'2016-12-05 23:04:59','YYYY-MM-DD HH24:MI:SS'-TO_dsinterval'00 0:05:00'返回一个日期数据类型,当您将其传递给TO_DATE时,oracle将其转换为VARCHAR2数据类型,以便它与隐式调用_CHAR值的参数的预期数据类型匹配,NLS_DATE_格式执行此强制转换,然后将其转换回日期数据类型

您只需执行以下操作:

SELECT TO_DATE('2016-12-05 23:04:59', 'YYYY-MM-DD HH24:MI:SS')
         - to_dsinterval('00 0:05:00')
FROM   DUAL;
如果您想要处理时区,则在时区使用时间戳,并将其转换为您想要存储日期的任何时区:

SELECT TIMESTAMP '2016-12-05 23:04:59 Europe/Paris' AT TIME ZONE 'UTC'
FROM   DUAL;
将在巴黎时区中创建时间戳,并将其转换为UTC时区中的正确时间。

日期数据类型不支持任何时区功能,您必须使用带时区的时间戳

你的问题

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;
是否有以下情况:

创建日期“2016-12-05 23:04:59” 减去间隔“00 0:05:00” 使用NLS_DATE_格式强制转换为VARCHAR2 使用YYYY-MM-DD HH24:MI:SS格式强制转换为日期 如果NLS_DATE_格式等于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;
到目前为止。。。同样有效。如果您需要时区支持,您必须执行以下操作:

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;

减法的结果已经是日期。你不需要另一个约会,这并不能解决时区的问题。如果您想在时区上执行某些操作,请在时区上使用时间戳数据类型可以在其上执行从天到秒的间隔运算。如果您确实选择DUMP TO_DATE'2016-12-05 23:04:59',YYYY-MM-DD HH24:MI:SS'-TO_DSINTERVAL'00 0:05:00',从DUAL returns Typ=13返回,这是一种日期数据类型,因此不存在对时间戳的隐式转换。
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;