首页 > 解决方案 > TO_TIMESTAMP 查询对于相同数据类型列 Oracle 的行为不同

问题描述

我有一个要查询的视图,该视图从 3 个不同的表中提取数据。奇怪的是,当我执行这个查询时:

    select * from CPOB_MONITORING_DASHBOARD where FISCAL_MONTH_START_DT =
 TO_TIMESTAMP('2016-01-01 00:00:00.000', 'YYYY-MM-DD HH24:MI:SS.FF')

它按预期工作..它返回所有带有日期的行2016-01-01

但是当我对另一列执行相同类型的查询时:

    select * from CPOB_MONITORING_DASHBOARD where VOYAGE_STRT_DT = 
TO_TIMESTAMP('2014-04-07 00:00:00.000', 'YYYY-MM-DD HH24:MI:SS.FF')

它不返回任何行.. 即使有许多日期的值为“2014-04-07”列来自不同的表并且类型为“日期”。我只能用TO_TIMESTAMP() ,不能TO_DATE()。关于我需要在哪里解决这个问题的任何想法?

标签: databaseoracle

解决方案


看起来您的所有FISCAL_MONTH_START_DT值都在午夜(从列名来看似乎是合理的),但您VOYAGE_STRT_DT不是 - 它们在一天中还有其他时间,因此它们与您的查询不匹配,您的查询仅在寻找午夜。

select * from CPOB_MONITORING_DASHBOARD
where VOYAGE_STRT_DT >= TO_TIMESTAMP('2014-04-07 00:00:00.000', 'YYYY-MM-DD HH24:MI:SS.FF')
and VOYAGE_STRT_DT < TO_TIMESTAMP('2014-04-08 00:00:00.000', 'YYYY-MM-DD HH24:MI:SS.FF')

或更简单地说:

select * from CPOB_MONITORING_DASHBOARD
where VOYAGE_STRT_DT >= TIMESTAMP '2014-04-07 00:00:00'
and VOYAGE_STRT_DT < TIMESTAMP '2014-04-08 00:00:00'

或者更简单地说:

select * from CPOB_MONITORING_DASHBOARD
where VOYAGE_STRT_DT >= DATE '2014-04-07'
and VOYAGE_STRT_DT < DATE '2014-04-08'

虽然如果你因为某种原因不能使用to_date()(!?)你可能也不能使用日期或时间戳文字。


当您以其他方式查询表时,您可能只会看到日期部分,这取决于您的客户端和 NLS 设置。要检查时间,您可以更改设置或明确格式化值:

select to_char(VOYAGE_STRT_DT, 'SYYYY-MM-DD HH24:MI:SS') as VOYAGE_STRT_DT
from CPOB_MONITORING_DASHBOARD
where VOYAGE_STRT_DT >= DATE '2014-04-07'
and VOYAGE_STRT_DT < DATE '2014-04-08'

推荐阅读