1

2011年2月28日から12年2月29日までの月を見つけると、oracleのmonths_between関数は12を返します。実際には12.096である必要があります。この関数は、うるう年を適切に計算していません。

2011年2月28日から2012年2月29日までの期間は1年(12か月)と1日です。

      select months_between('28-FEB-12', '28-FEB-11') from dual; -- 12
      **select months_between('29-FEB-12', '28-FEB-11') from dual; -- 12**
      select months_between('28-FEB-12', '27-FEB-11') from dual; -- 12.0322
      select months_between('27-FEB-12', '28-FEB-11') from dual; -- 11.9677

これはOracleのバグですか??..

-ヴィシュワ

4

2 に答える 2

5

Oracleのドキュメントから:

MONTHS_BETWEEN は、date1 と date2 の間の月数を返します。date1 が date2 より後の場合、結果は正になります。date1 が date2 より前の場合、結果は負になります。date1 と date2 が月の同じ日であるか、月の最後の日のいずれかである場合、結果は常に整数になります。それ以外の場合、Oracle Databaseは、31日の月に基づいて結果の小数部分を計算し、時間コンポーネントdate1とdate2の差を考慮します。

したがって、文書化された動作に従っています。それはあなたが期待したものではありません。

于 2012-10-03T13:34:01.407 に答える
-1

ORACLEがそう言っているので、これはバグではありません。これは、人間によって引き起こされた論理エラーであり(そして何か正しいものとして文書化されています)、さらに悪いことです。

1 月と 2 月の最後の日の差がちょうど 1 か月 (ちょうど 29 日) であるとしたら、どうしてでしょうか。下記を参照してください:

MONTHS_BETWEEN('29-FEB-12','31-JAN-12')
1

余分な日 (30 日) があると、月の差は 1 未満になります。以下を参照してください。

MONTHS_BETWEEN('29-FEB-12','30-JAN-12')
.967741935

違う。それはまったく正しくありません!

別の手で SQL Server はこれを正しく処理します。

select DATEDIFF(MM,'29-FEB-12','30-JAN-12')
select DATEDIFF(MM,'29-FEB-12','31-JAN-12')

どちらも1

于 2012-12-07T18:05:30.053 に答える