2016-11-25 94 views
0

我在這個查詢問題的日期:ORA-01847錯誤得到

select to_char(ADD_MONTHS((LAST_DAY(to_date(DATEVAR, 'yyyymmdd'))+1),-1),'yyyymmdd') from mytable 
where ROWNUM=1 
and var = to_char(last_day(to_date(DATEVAR, 'yyyyMMdd')), 'WW')-1; 

我希望它返回時,VAR是本月的最後一週數量和返回空值時,它不是「T如果我的變種是 '29'(weekNumber)我得到:

ORA-01847: 「一個月的天必須在1月的最後一天之間」

但是,如果我改變週數爲'30'(本月的上週數)我得到正確的結果:

'20160701' 

請幫助謝謝。

+0

上週數量?上個星期的月數是30?當你的思想混淆在「星期」和「日」之間時,你如何期望寫出正確的代碼?沒有辦法從困惑的想法中編寫正確的代碼。不管其他什麼,你的最後一行將會失敗:你計算一個'to_char()'的東西(無所謂),然後你從結果字符串中減1。你需要一種不同的方法來問你的問題:陳述你正在做什麼,你的數據是什麼樣的,你想要什麼輸出 - 不要只顯示你的代碼(反正它不能正常工作)。 – mathguy

+0

@mathguy,但今年有超過30周,那麼爲什麼你會認爲OP在日期和星期數字之間變得混亂? – Boneist

+2

***從不***,*永遠*在'date'值上調用'to_date()'。 –

回答

0

我沒有看到您的代碼有問題? var設置爲30時:

WITH mytable AS (SELECT trunc(SYSDATE, 'yyyy') - 1 + LEVEL datevar 
       FROM dual 
       CONNECT BY LEVEL <= 366) 
SELECT to_char(add_months((last_day(datevar) + 1), -1), 'yyyymmdd') ret_col 
FROM mytable 
WHERE rownum = 1 
AND 30 = to_number(to_char(last_day(datevar), 'WW'))- 1; 

RET_COL 
-------- 
20160701 

在上面的查詢中將30更改爲29,並且沒有返回行。

我唯一能想到的就是你的datevar列有一個VARCHAR2而不是DATE的數據類型,並且由於你的NLS_DATE_FORMAT設置你遇到了一些隱含的日期轉換問題。

N.B.編輯我的查詢以刪除datevar上的to_date(),(因爲我將datevars定義爲DATEs,這是一件非常愚蠢的事情!謝謝@mathguy。)另外,添加一個明確的to_number ()在where子句中。

+1

是的我的數據類型是VARCHAR2,我會改變爲DATE,thx –

+0

您仍然依賴於我在OP的評論中指出的同樣的隱式轉換 - 在最後一行中,您將從字符串中減去1 。這可能是Oracle猜測正確的情況之一,但從字符串中減1通常不是一個好習慣。 – mathguy

+0

@mathguy在這個例子中,將字符串隱式轉換爲數字是相當安全的。但我明白你的意思,並且增加了一個明確的to_number() – Boneist