2016-07-27 131 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 - 你現在可以檢查嗎? –