2012-12-03 236 views
0

我正在處理作業問題,我很接近但需要一些數據轉換的幫助。或SYSDATE - 起始日期計算時間戳和時間間隔:NUMTOYMINTERVAL SYSTDATE計算SQL查詢

的問題是:

使用EX架構,寫一個SELECT語句檢索來自Date_Sample表DATE_ID和起始日期(以下格式),其次是使用了一列名爲Years_and_Months_Since_Start間隔函數來檢索start_date和sysdate之間經過的年數和月數。 (您的值會根據您實驗室的日期而有所不同。)僅顯示開始日期等於2月28日(任何一年)的月份和日期的記錄。

DATE_ID  START_DATE       YEARS_AND_MONTHS_SINCE_START 
2   Sunday , February 28, 1999  13-8       
4   Monday , February 28, 2005  7-8       
5   Tuesday , February 28, 2006  6-8 
是指這個問題

我們EX架構是一個簡單的Date_Sample表有兩列:

DATE_ID  NUMBER NOT Null 

START_DATE DATE 

我寫了這個代碼:

SELECT date_id, TO_CHAR(start_date, 'Day, MONTH DD, YYYY') AS start_date , 
    NUMTOYMINTERVAL((SYSDATE - start_date), 'YEAR') AS years_and_months_since_start 
FROM date_sample 
WHERE TO_CHAR(start_date, 'MM/DD') = '02/28'; 

但我的年和月以來啓動列無法正常工作。當計算日期從1999年開始計算時,它的年數和月數都非常高。即它應該是13-8,我得到5027-2,所以我知道這是不正確的。我使用了NUMTOYMINTERVAL,它應該是正確的,但不要認爲sysdate-start_date正在工作。 start_date的數據類型只是日期。我嘗試了ROUND,但可能需要一些幫助才能做到。

我的計算有些問題,並試圖找出如何獲得正確的間隔。不知道我是否已經向每個人提供了足夠的信息,但如果我在做之前弄清楚了,我會讓你知道。

這是Murach的Oracle和SQL/PL第17章中的一個問題,如果其他人試圖學習該章。頁面559.

回答

1

你會想要MONTHS_BETWEEN在那numtoyminterval作爲減去兩個日期變量的產物給出答案在幾天內你不可用,它的如此之高的原因是你告訴甲骨文的答案是多年!還可以使用to_char上的fm修飾符來防止多餘的空白。

select date_id, 
     to_char(start_date, 'fmDay, Month DD, YYYY') as start_date, 
     extract(year from numtoyminterval(months_between(trunc(sysdate), start_date), 'month')) 
     || '-' || 
     extract(month from numtoyminterval(months_between(trunc(sysdate), start_date), 'month')) 
     as years_and_months_since_start 
    from your_table 
where to_char(start_date, 'MM/DD') = '02/28'; 
+0

感謝MONTHS_BETWEEN答案是去那裏的路上。在沒有摘錄和年份的情況下編寫查詢的任何可能性。我們還沒有在課堂上討論過。這確實給了我正確的答案,儘管如此,這一切都很重要。再次感謝您今天的時間! – MeachamRob

+0

否,因爲「間隔」數據類型實際上是不可格式化的(從Oracle很好的省略),即to_char()不能對它們產生任何影響。所以如果你選擇它,你會看到它在標準格式或+年 - 月,如+ 000000001-10。格式化的唯一方法是使用extract()和手動構建字符串。 – DazzaL

0

可以簡化這樣

SELECT date_id, start_date, numtoyminterval(months_between(sysdate, start_date), 'month') as "Years and Months Since Start" 
FROM date_sample 
WHERE EXTRACT (MONTH FROM start_date) = 2 AND EXTRACT (DAY FROM start_date) = 28;