0

私は宿題の問題に取り組んでいます。私は近くにいますが、データ変換について助けが必要だと思います。またはsysdate-start_date計算

質問は:

EXスキーマを使用して、Date_Sampleテーブル(以下の形式)からdate_idとstart_dateを取得するSELECTステートメントを記述し、その後に、interval関数を使用して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スキーマは、2つの列を持つ単純な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。

4

2 に答える 2

1

2つの日付変数を差し引いた結果が数日で答えが得られますMONTHS_BETWEENnumtoyminterval、これは使用できません。その理由は、答えが年単位であるとオラクルに伝えたからです。またfm、 to_char で修飾子を使用して、余分な空白を防ぎます。

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';
于 2012-12-03T10:59:18.150 に答える
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;
于 2013-05-04T06:50:08.200 に答える