2016-07-27 5 views
0

Oracle Months_Betweenファンクションの動作を理解するのに役立つ人はいますか? 私がselect MONTHS_BETWEEN('02-28-2015', '01-28-2015') を照会すると、1の整数値が得られますが、私が照会すると select MONTHS_BETWEEN('02-28-2015', '01-29-2015')となり、私は0.96になります。MONTHS_BETWEENファンクション

+0

あなたは1月29日から行ってきました - > 2月28日。それは1ヶ月未満です。月が常に一定の大きさを持たないので、月の数学はいつも厄介な臭いの混乱です。それは28,29,30,31です。 –

+0

@MarcBその場合、なぜ選択肢MONTHS_BETWEEN('02 -28-2015 '、'01 -31-2015')の​​1を得るのですか – Peppy

答えて

2

Googleがお手伝いできます。あなたは "Oracle months_between"を検索することができます。これにより、ドキュメントが表示されます。 https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions089.htm

注 - 「31日間の月」のコンベンションで月末に奇妙な結果が生じることがあります。検討してください:

select months_between(date '2016-07-02', date '2016-07-01') as one_day, 
     months_between(date '2016-07-01', date '2016-06-30') as another_day 
from dual; 

    ONE_DAY ANOTHER_DAY 
---------- ----------- 
.032258065 .064516129 

1 row selected. 

6月は31日を過ぎていました。それはしませんが、months_betweenと同じように扱います。

+0

ありがとう!! ...私は何かが欠けていないことを確認したかっただけです。その機能は30,31,28日の月末には本当に完璧ではありません。 – Peppy

+2

「完全」を定義します。関数は、ドキュメントが指示していることを正確に行います。 – hetOrakel

+0

@hetOrakel - おそらく完璧な計算はありませんが、明確な意味がある(そして31日間の大会よりも議論の余地がある)代替案は、実際の日の大会。毎日1/n月に等しくなります。ここでnは、その日が属する月の日数です。 – mathguy

0

あなたが月単位の月数を決定しようとしていて、日数を気にしないで作業している場合は、私はこのような状況で自分自身を見つけることが多い...あなたは月のセットの月の数を決定するためにかなり信頼できる日付の操作を少し行うことができます。例えば、7月から9月までは日付で始まります。

Thusly:

WITH MONTHS AS (
SELECT 
    SYSDATE  DATE_ONE 
, SYSDATE+57 DATE_TWO 
FROM DUAL 
) 


SELECT 
m.* 
,TO_CHAR(m.DATE_ONE,'MON') START_MONTH 
,TO_CHAR(m.DATE_TWO,'MON') END_MONTH 
,MONTHS_BETWEEN(m.DATE_TWO,m.DATE_ONE)          UNEXPECTED_RESULT 
,MONTHS_BETWEEN(LAST_DAY(m.DATE_TWO),LAST_DAY(ADD_MONTHS(m.DATE_ONE,-1))) EXPECTED_RESULT 
FROM MONTHS m 
; 
関連する問題