• 締切済み

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'に設定すれば日付差が月で返って きますが、小数点以下が確か切り捨てられたように 記憶しています。 何とかして、小数点以下も算出できる方法を ご存知の方がいらっしゃいましたら、 お教えください。 宜しくお願い致します。 以上

みんなの回答

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.3

かなり強引ですが・・・ 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)
回答No.2

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 こんな感じですね。

i2rainbow
質問者

お礼

iiikkk様、御回答ありがとうございます。 Oracleのmonths_betweenの仕様は分かったのですが、 months_betweenと同じ動きをSQL Serverで書くと どのようになるかを知りたかったのですが。 もし、お分かりでしたら宜しくお願い致します。 以上

  • iiikkk
  • ベストアンサー率37% (92/247)
回答No.1

少数点以下を出してどうするのですか? とりあえず、 datediffでd設定にして30(31?)で割る ようにすると、同様のことができませんか。

i2rainbow
質問者

補足

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ヶ月 としたいということです。 そこで、少数をあらわす方法がないかと考え、 質問させて頂きました。 拙い文章で申し訳ありませんが、 宜しくお願い致します。 以上

関連するQ&A