- ベストアンサー
T-SQL(SQL Server2000) 月数の差の求め方
お世話になります。 T-SQL(SQL Server2000)で月数の差の求めたいのですが、良い方法がないでしょうか? 関数の中に"DATADIFF"というものがありますが、これだと↓ SET @l_day1 = CONVERT(DATETIME,'2008/10/31',120) SET @l_day2 = CONVERT(DATETIME,'2008/11/01',120) DATADIFF(MONTH,@l_day1,@l_day2) /* 結果 */ 1 "2008/10/31" と "2008/11/01" の24時間の差の場合でも、結果に月数のさは"1"と出てしまいます。 上記の改善方法、又は、月数の差を求めれるロジック等をご存知の方が居ましたらお知恵をお貸しください。 宜しくお願い致します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
10/31の1ヶ月後はいつなんだという疑問は残りますが、やりたいことが > 上記日付1と日付2の期間の差が1ヶ月以内の場合は > SET 変数A = '1ヶ月以内です' > それ以外の場合は、 > SET 変数A = '1ヶ月以上です' ということであれば、こういう方法はどうでしょう? set @l_day1 = DateAdd(d,-1,DateAdd(m,1,@l_day1)) select case when @l_day1 > @l_day2 then '1ヶ月未満' else '1ヶ月以上' end 基準となる日に1月を足して1日引いたものと比較するというものです。
その他の回答 (5)
お詫び: 私の回答は、多分、間違っています。 テストもしていませんので。 で、一切、無視されてください。
Format("2008/10/17", "dd") > Format("2008/11/17", "dd")-->0 Format("2008/10/16", "dd") > Format("2008/11/17", "dd")-->1 年齢補正ではなかったですね!
>今日"2008/10/17"の1ヵ月後は、翌月の"2008/11/17"が1ヶ月後ですよね? いわゆる満年齢計算に準じたやり方をしたいということですね。 Public Function GetAge(ByVal Birthday As Date, ByVal Hiduke As Date) As Long GetAge = DateDiff("yyyy", Birthday, Hiduke) + _ (Format(Birthday - 1, "mm/dd") > Format(Hiduke, "mm/dd")) End Function DateDiff("mm", "2008/10/18", "2008/11/17")-->1 DateDiff("mm", "2008/10/17", "2008/11/17")-->1 Format("2008/10/17", "mm/dd") > Format("2008/11/17", "mm/dd")-->0 Format("2008/10/16", "mm/dd") > Format("2008/11/17", "mm/dd")-->1 この両者の合計値は 1 ないし 2 で、-1すれば0と1 ロジックはこういうことだと思います。
- Pakkun10
- ベストアンサー率44% (22/50)
1ヶ月は必ず30日なのですか?
Select DateDiff(MONTH, '2008/10/31', '2008/11/30') 1 Select DateDiff(MONTH, '2008/10/29', '2008/11/30') 1 ですよね。 で、どういうロジックなのでしょうか?
補足
肝心なことを記述するのを忘れてしまいました;; 申し訳ありません。 DateDiffでは月を跨いだだけで差が"1"と出てしまうので、 "2008/10/31" と "2008/11/01" を比較した場合の差は"0"とし、 "2008/10/31" と "2008/11/29" を比較した場合の差は"1"というようにさを出したいのですが・・・ うまく伝わったでしょうか?
補足
今日"2008/10/17"の1ヵ月後は、翌月の"2008/11/17"が1ヶ月後ですよね? 処理としては、 例) 日付1 = '2008/10/10' 日付2 = '2008/11/09' 上記日付1と日付2の期間の差が1ヶ月以内の場合は SET 変数A = '1ヶ月以内です' それ以外の場合は、 SET 変数A = '1ヶ月以上です' のような処理を行いたいのですが、伝わりましたでしょうか? 実際に処理を行うときは、日付は任意で入力される為 固定で30日で比較してしまうと日にちが合わなくなってしまいます・・・