アプリ版:「スタンプのみでお礼する」機能のリリースについて

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'に設定すれば日付差が月で返って
きますが、小数点以下が確か切り捨てられたように
記憶しています。

何とかして、小数点以下も算出できる方法を
ご存知の方がいらっしゃいましたら、
お教えください。

宜しくお願い致します。

以上

A 回答 (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文中のインデントは全角空白なので、そのままコピー&ペーストでは使えません。ご注意ください。)
    • good
    • 1

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

こんな感じですね。
    • good
    • 0
この回答へのお礼

iiikkk様、御回答ありがとうございます。

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

以上

お礼日時:2005/06/07 23:20

少数点以下を出してどうするのですか?



とりあえず、
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ヶ月

としたいということです。
そこで、少数をあらわす方法がないかと考え、
質問させて頂きました。

拙い文章で申し訳ありませんが、
宜しくお願い致します。

以上

補足日時:2005/06/03 22:43
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!