- 締切済み
SQL Sever での日付の差の求め方(月単位小数付き)
Oracle で日付の差を求める関数に「months_between」 というものがあり、日付A(yyyy-mm-dd)と 日付B(yyyy-mm-dd)の差(A<B の場合)を算出する時は、 select months_between(B ,A) from dual; で算出できます。 しかも、日付差が何ヶ月で返ってきて、月の端数は 小数点以下として返ります。 これを、SQL Server で実現しようとした場合、 どのようにすればよいでしょうか? SQL Server には「datediff」という関数があり、 時間単位を'm'に設定すれば日付差が月で返って きますが、小数点以下が確か切り捨てられたように 記憶しています。 何とかして、小数点以下も算出できる方法を ご存知の方がいらっしゃいましたら、 お教えください。 宜しくお願い致します。 以上
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
かなり強引ですが・・・ select * from dual a b --------------------------- --------------------------- 2005/2/16 0:00 2005/3/16 0:00 2005/7/16 0:00 2005/8/16 0:00 2005/2/16 0:00 2005/3/17 0:00 のとき、 select datediff( mm, datename(yy, a) + '-' + datename(mm, a) + '-1', datename(yy, b) + '-' + datename(mm, b) + '-1' ) + case when datename(dd, a) < datename(dd, b) then 1 else 0 end from dual ----------- 1 1 2 となります。 内容は (1) aとbをyyyy/mm/ddからyyyy/mm/1(月始め)に変換し、datediffで月数を計算 (2) aの日付(dd)よりbの日付(dd)が大きい場合は切り上げるので月数を1つ増やす というものです。 (SQL文中のインデントは全角空白なので、そのままコピー&ペーストでは使えません。ご注意ください。)
- iiikkk
- ベストアンサー率37% (92/247)
Oracleのmonths_betweenの仕様ですが、 第一引数の日が1で、第二引数の日付が1であれば、整数が返ってくる 第一引数の日が1で、第二引数の日付が2であれば、整数部+1/31が返ってくる 第一引数の日が1で、第二引数の日付が3であれば、整数部+2/31が返ってくる ということで、 select TRUNC(months_between( to_date('2005/03/15','yyyy/mm/dd') , to_date('2005/02/14','yyyy/mm/dd') )) months , (TRUNC(to_date('2005/03/15','yyyy/mm/dd') - ADD_MONTHS( to_date('2005/02/14','yyyy/mm/dd') , TRUNC(months_between( to_date('2005/03/15','yyyy/mm/dd') ,to_date('2005/02/14','yyyy/mm/dd') )))) / 31) days from dual こんな感じですね。
- iiikkk
- ベストアンサー率37% (92/247)
少数点以下を出してどうするのですか? とりあえず、 datediffでd設定にして30(31?)で割る ようにすると、同様のことができませんか。
補足
iiikkk様、御回答ありがとうございます。 datediffでd設定にして30(31?)で割るというのは 私も考えたのですが、ひと月は28日の日もあれば 30日の日、31日の日があります。 それを考慮したいと思っています。 私の質問の仕方が悪かった為、少し補足させて 頂きます。 例えば、2005-02-16~2005-03-16は28日ありますが、 Oracleのmonths_betweenでは「1(ヶ月)」が 返ってきます。 また、2005-07-16~2005-08-16は31日ありますが、 同様に「1(ヶ月)」が返ってきます。 しかし、2005-02-16~2005-03-17は29日あり、 months_betweenでは「1.*****(ヶ月)」と少数が 返ってきます。 要するに、この日付差を少数部を切り上げた形で 答えを算出したいというのが本来の目的です。 2005-02-16~2005-03-16 -> 1ヶ月 2005-07-16~2005-08-16 -> 1ヶ月 2005-02-16~2005-03-17 -> 2ヶ月 としたいということです。 そこで、少数をあらわす方法がないかと考え、 質問させて頂きました。 拙い文章で申し訳ありませんが、 宜しくお願い致します。 以上
お礼
iiikkk様、御回答ありがとうございます。 Oracleのmonths_betweenの仕様は分かったのですが、 months_betweenと同じ動きをSQL Serverで書くと どのようになるかを知りたかったのですが。 もし、お分かりでしたら宜しくお願い致します。 以上