2014-10-30 34 views
0
SELECT months_between(TO_DATE(SYSDATE,'DD-MM-YYYY'),TO_DATE(DATE_COLUMN,'DD-MM-YYYY')) FROM TABLE_A; 

1.I了「其中一個數字,預計非數字字符找到」MONTHS_BETWEEN錯誤,並創造標誌

此外,如何處理空值。我想一個錯誤,說:如果table_A中的date_column爲null,則放置一個默認日期。

2.

SELECT MONTHS_BETWEEN(TO_DATE(SYSDATE,'DD-MM-YYYY'),TO_DATE(DATE_COLUMN,'DD-MM-YYYY')) FROM TABLE_A; 

日期之間計算個月後,我想了日期範圍與一個case語句來分類記錄..

例如.. 如果MONTHS_BETWEEN的記錄集是22 ..我想爲所有這些記錄添加一個標記'0-24'.. 同樣,如果months_between是34 ..我想爲所有記錄放置一個標記'24 -48'在這個範圍內..

+0

你並不需要轉換SYSDATE,按照戈登·利諾夫的答案。什麼數據類型是DATE_COLUMN?如果它是一個日期,正如名字所暗示的那樣,那麼你也不需要轉換它,並且如果你嘗試的話會得到一個錯誤。 – Bacs 2014-10-30 11:51:58

回答

2

要添加到前面的回答你能避免空這樣的:

SELECT months_between(trunc(SYSDATE), nvl(TO_DATE(DATE_COLUMN,'DD-MM-YYYY'), sysdate))

如果你的DATE_COLUMN是日期類型比你並不需要使用TO_DATE()

所以你會得到這樣的

SELECT months_between(trunc(SYSDATE), nvl(trunc(DATE_COLUMN), sysdate))

財產以後你的問題的第二部分,你可以試試這樣的事情:

SELECT 
     trunc(months_between(trunc(SYSDATE), trunc(DATE_COLUMN))), 
     (trunc(months_between(trunc(SYSDATE), trunc(DATE_COLUMN))/24)*24)||'-'||((trunc(months_between(trunc(SYSDATE), trunc(DATE_COLUMN))/24)*24)+24) 
FROM your_table 
2

你不需要d將sysdate轉換爲日期。試試這個:

SELECT months_between(trunc(SYSDATE), TO_DATE(DATE_COLUMN,'DD-MM-YYYY')) 

問題是Oracle中日期的默認格式使用月份名稱。當你說to_date(sysdate, . . .)時,第一個參數被轉換爲一個字符串,然後回到日期。

順便說一句,在trunc()是無關緊要的,但你似乎要提取的sysdate所以我把它在日部分

編輯:

如果date_column已經是一個日期,只是使用:

SELECT months_between(trunc(SYSDATE), DATE_COLUMN) 
+0

此外,我不認爲查詢給出了正確的結果。例如,對於日期'27 -APR-99',查詢給出結果22986.096 .. – Spider 2014-10-30 11:56:55

+1

檢查年份的全部值在那一天,自公元99年起有22986個月! – Bacs 2014-10-30 11:59:21

+0

@ user2942261。 。 。這是'date_column'的問題。如果這真的存儲爲日期/時間,那麼刪除'to_date()':'months_between(sysdate,date_column)'應該沒問題。如果以字符串形式存儲(如代碼所示),那麼問自己爲什麼使用錯誤的數據類型存儲日期。 – 2014-10-30 11:59:56

0

這樣的工作,如果你有date_column中的空值,並希望通過默認日期。

select months_between(SYSDATE,coalesce(DATE_COLUMN,to_date('01-01-2014','DD-MM-YYYY'))) DIFF from TABLE_A;