oracle to_date:在select中工作;在哪里条款中没有有效的月份



我写了一个由2个子征服组成的查询。子征格格式化所得的字段名称和数据类型,因此它们相同。主要查询是直接的联合。

两个子Queries都从托管的Oracle服务器检索数据;我们无法控制数据库结构。两个子Queries之一使用字符串数据类型包含DateTime。我在选择中使用以下代码将值转换为DateTime,并添加2个小时以调整时区:

TO_DATE(TCF.TRANS_DATE, 'MM-DD-YYYY HH24:MI:SS') + 2/24 AS TRANS_DT,

这会产生正确的值。

这是皱纹:在该子句中产生错误ORA-01843的同一to_date:不是有效的月份。这是完整的从句:

WHERE TO_DATE(TCF.TRANS_DATE, 'MM-DD-YYYY HH24:MI:SS') + 2/24 >= {?START_DT}

显而易见的问题是,为什么以上在选择中有效但在Whater子句中丢弃此错误?

字段中的值按TO_DATE语句中指定的格式。如果不是我期望Select语句会产生错误,但是当删除Where子句时没有错误。

我尝试将trunc()添加到where子句,因为参数{?start_dt}是日期数据类型。我还用力编码了有效的日期,以代替使用该参数。这些对错误都没有任何影响。

完成第二个子查询的Where子句,我要完成该项目并继续前进。我正在使用具有成熟且可靠连接的Crystal Reports来访问数据库。任何想法或建议都将被赞赏。

有关您的信息,这是整个查询:

SELECT DISTINCT TCF.TRIPCARD_UNIT_NO AS UNIT_NO,
TO_DATE(TCF.TRANS_DATE, 'MM-DD-YYYY HH24:MI:SS') AS TRANS_DT2,
TCF.ODOMETER AS METER
FROM MFIVE.VIEW_TRIPCARD_FAILED_TRANS TCF
WHERE TO_DATE(TCF.TRANS_DATE, 'MM-DD-YYYY HH24:MI:SS') >= TO_DATE('02-01-2019 00:00:00', 'MM-DD-YYYY HH24:MI:SS')

出于挫败感,我从trans_dt字符串中解析了一个月,日和年的值。没有适当范围的值;特别是所有月份的值是预期的1到12个。

我在针对上述串联零件的Where子句中创建了一个新的to_date语句。检查并仔细检查了格式...我有相同的错误。

在我看来,在where子句中不允许to_date。还有其他人听说过这种限制吗?有什么方法可以在SQL中创建DateTime变量并将其传递给Where子句?

更新#3:

离开Where子句省略了我将查询的其余部分用作subquery,并从trans_dt中使用了提取月份作为选择语句。这个子查询运行精美,整个数字从1到12产生。这再次确认不涉及畸形的日期。

扩展了子查询概念,我试图将其应用于此语句的WHERE子句:WHERE TRUNC(TCF2.TRANS_DT) >= TO_DATE('02/01/2019', 'MM/DD/YYYY')这产生了相同的错误!我闻到了一个错误,但是如果我知道它是什么,那该死。

我可以想到两个可能的原因:

首先,您正在运行查询,但仅查看几行结果 - 而不是整个结果集。您看到的行没有任何日期问题。如果您滚动到最后,那么您会看到问题。

第二个原因是 select表达式是在 all 过滤之后运行的(至少在某些情况下)。不良值可以通过其他过滤条件过滤。当表达式移动到where子句时,所有数据可能会通过此条件。

在等同或匹配时请检查数据类型:

WITH S_DT AS 
(
SELECT TO_DATE(TO_CHAR(SYSDATE,'MM-DD-YYYY HH24:MI:SS'), 'MM-DD-YYYY HH24:MI:SS') START_DT FROM DUAL
),
TAB AS
(
SELECT TO_DATE(TO_CHAR(SYSDATE,'MM-DD-YYYY HH24:MI:SS'), 'MM-DD-YYYY HH24:MI:SS') + 2/24 AS TRANS_DT FROM DUAL
UNION ALL
SELECT TO_DATE(TO_CHAR(SYSDATE,'MM-DD-YYYY HH24:MI:SS'), 'MM-DD-YYYY HH24:MI:SS') - 2/24 FROM DUAL
UNION ALL
SELECT TO_DATE(TO_CHAR(SYSDATE,'MM-DD-YYYY'), 'MM-DD-YYYY') + 2/24 FROM DUAL
)
SELECT * FROM TAB,S_DT WHERE TAB.TRANS_DT >= S_DT.START_DT;

输出:

TRANS_DT  START_DT 
--------- ---------
2/22/2019 2:09:39 PM    2/22/2019 12:09:39 PM

或者,您也可以尝试使用此NEW_TIME函数以进行time zone更改。

SELECT SYSDATE, 
       NEW_TIME(SYSDATE, 'GMT', 'EST') 
FROM dual;

输出:

SYSDATE   NEW_TIME(SYSDATE,'GMT','EST')
--------- -----------------------------
2/22/2019 12:10:10 PM   2/22/2019 7:10:10 AM

相关内容

最新更新