2016-07-27 195 views
-1

我有以下的表达SQL TO_CHAR TO_DATE TO_NUMBER

WHERE TO_CHAR(TO_DATE(dab.SNAPSHOT_DAY,'YYYYMMDD'),'MM') >= 
     TO_CHAR(TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD'),'MM') -1 

'{RUN_DATE_YYYYMMDD}' returns the date of when the data was captured. 

我得到以下错误:

ORA-01481:invalid number format model

列在数据类型方面协调一致。 dab.SNAPSHOT_DAY{DATE} 2016-07-24 00:00:00.0

你有什么暗示会发生什么?

我所试图做的是获取当前和过去的一个月的结果。这就是为什么我要将两个日期转换为MONTH(MM),然后减去1.例如:

Snapshot_day = 05/JUN/2016 --> 06 
RUN_DATE = 27/JUL/2016 --> 07 
Comparing them: 06 >= 07 - 1 TRUE 

谢谢大家!

+2

列'SNAPSHOT_DAY'的日期类型是什么? –

+0

'TO_DATE(dab.SNAPSHOT_DAY, 'YYYYMMDD')'是毫无道理的,如果'snapshot_day'已经是一个'date'柱。 –

+0

而不是试图解决这个问题,你最好用简单的英语说什么输入是什么以及期望的结果是什么。在任何情况下,比较日期后,您将它们转换为字符串是错误的,并且不清楚您打算如何从字符串中减去1。 – mathguy

回答

0

您可以使用trunc以获得您想要

where trunc(dab.SNAPSHOT_DAY,'MM') >= 
    trunc(to_date('{RUN_DATE_YYYYMMDD}','YYYYMMDD'),'MM') -1 

日期的特定部分,但我认为一个更好的解决方案将是:

where snapshot_day >= add_months(to_date('{RUN_DATE_YYYYMMDD}','YYYYMMDD'),-1) 

而且如果{RUN_DATE_YYYYMMDD}居然是参数来自某种类型的日期:

where snapshot_day >= add_months(run_date),-1) 
+0

尽管这不会抛出一个ORA-01481; MM字符串将被隐式转换为数字。无论如何,我怀疑你的解决方案是关闭的 - 只比较一个月的数字,没有一年,可能是不对的。 -1可能需要在trunc之前 - 但是不清楚真正需要什么。 –

+0

我已经提供了进一步的信息,这将使我的问题更清晰 非常感谢您的支持和教育! – alexparq

+0

@alexparq - 你现在可以检查吗? –