
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件)
- 最新から表示
- 回答順に表示
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文中のインデントは全角空白なので、そのままコピー&ペーストでは使えません。ご注意ください。)
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
こんな感じですね。
iiikkk様、御回答ありがとうございます。
Oracleのmonths_betweenの仕様は分かったのですが、
months_betweenと同じ動きをSQL Serverで書くと
どのようになるかを知りたかったのですが。
もし、お分かりでしたら宜しくお願い致します。
以上
No.1
- 回答日時:
少数点以下を出してどうするのですか?
とりあえず、
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ヶ月
としたいということです。
そこで、少数をあらわす方法がないかと考え、
質問させて頂きました。
拙い文章で申し訳ありませんが、
宜しくお願い致します。
以上
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL SQLについて質問です。 SELECT TO_CHAR(TO_DATE('90-10-08.'YY- 4 2022/05/13 20:55
- MySQL SQLについて教えて下さい。 SELECT分で、あるカラムにある日付の 半年先のデータを取って来たい 3 2022/12/07 22:28
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- MySQL ある時間以内の利用者の抽出について 3 2022/03/26 11:15
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/01/23 17:13
- Excel(エクセル) Excel 数行を1組とする300組ほどあるデータの項目を揃えたいです。 3 2023/01/26 19:38
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 09:24
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 11:02
- SQL Server SQL 期間内の実施数を合計したい 2 2023/03/03 22:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
日付型カラムへのデータINSERT
-
SQL*Loader フォーマット変換...
-
SQL*Loaderでのsysdate使用
-
ALTER SESSIONについて
-
DB2でのシステム日付のinsert、...
-
SQL Sever での日付の差の求め...
-
date型へのinsertについて
-
date '0001-01-01'からの日数
-
date型のインデックス
-
Accessのマクロでモジュールを...
-
キャッシュを使わずにSELECTを...
-
Statement ignored というエラー
-
sqlplusのspoolで空白行出現
-
ODBCリンクの際にACCESSでは読...
-
【Excel VBA】 WorksheetやRa...
-
Excel VBAで「プログラム実行」...
-
エクセルVBAでUserFormを起動し...
-
callで順に実行されるプロシー...
-
SQLで部分的にGROUP BYしたいとき
-
或るプロシージャの呼び出し元判定
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
日付型カラムへのデータINSERT
-
SQL*Loaderでのsysdate使用
-
DB2でのシステム日付のinsert、...
-
SQL*Loader フォーマット変換...
-
date型のインデックス
-
SQL*PLUSでの分秒までの表示の仕方
-
ALTER SESSIONについて
-
エクセル上の 2017/10/27 7:01...
-
to_date使用時に発生するエラー...
-
SQL Server で 翌月10日を取...
-
SQLエラーについて
-
実行エラー 3075:クエリ式`作...
-
(日付 - 日付)/数値
-
SQL Sever での日付の差の求め...
-
SQLです。下記の問合せを行うク...
-
yyy/mm/dd/形式
-
日付範囲を展開したレコードを...
-
date型へのinsertについて
-
Access VBA で Format ( date ,...
-
ACCESS2000でクエリを抽出条件...
おすすめ情報