掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
和暦の引き算や平均について? (ID:140458)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
これは VB2008 の話題ですか? それとも、SQL2005 の話題ですか? SQL Server 2005 の SQL の書き方などの質問だとしたら、板違いかと。 > DBからの読み込みで西暦を和暦に変換することは出来ました。 幾つかの方法が考えられますが、どのような方法で行ったのでしょうか? (VB2005 だと、System.Globalization.CultureInfo などを利用できますね) > 和暦同士の引き算や平均を出すためにはどうしたらいいのでしょうか?? 和暦や西暦というのは、表示上の話であって、データそのものは日付値ですよね。 表示されている「文字列」だと、直接計算するのは厄介ですけれども、 元データ(日付型)に対しては、そのまま算出できるはずですよ。 > 1.10年前の平成20年9月18日から平成10年9月18を引き算するためには? 主要なデータベース製品の多くは、日付型同士をそのまま引き算でき、 その結果を、日数を表す数値で返すことが多いです。SQL Server もそうです。 直接引き算できない DB の場合は、日付計算のための関数等が 用意されていると思いますので、それらを使えば良いかと。 また、(データベース側ではなく)VB2005 の日付型に対して計算する場合は、 単純に引き算すれば、その日数差が TimeSpan 型で返されるので、そこから算出できます。 > 2.平成15年5月18日、平成11年10月27日、平成20年9月16日、平成6年7月20日 > があったとしたら平均を出すには?? どのような結果になるのを想定しているのか、にもよりますが、ロジック的には 適当な基準日(固定値でも良いし、上記いずれかの日付の1つを使っても良い)を用意し (1) 基準日から、平成15年 5月18日 までの経過日数を求める (2) 基準日から、平成11年10月27日 までの経過日数を求める (3) 基準日から、平成20年 9月16日 までの経過日数を求める (4) 基準日から、平成 6年 7月20日 までの経過日数を求める (5) 上記 (1)〜(4) で得た経過日数の平均値を求める (6) 基準日に、上記 (5) で得た経過日数を加えて、日付を出す という処理で得られますね。VB であっても、SQL Server であっても。 ここは VB の掲示板なので、VB 側の算出方法で書きますが、 たとえばこんな感じで、平成13年8月8日という日付が得られます。 '================================ '日付値の一覧を用意 Dim dateList As New List(Of Date)() '今回の処理対象の日付 4 つを登録 'ちなみに #M/d/yyyy# というのは、VB の日付型リテラル表記法です。 dateList.Add(#5/1/2003#) dateList.Add(#10/27/1999#) dateList.Add(#9/16/2008#) dateList.Add(#7/20/1994#) '推奨はしませんが、一応、下記の書き方もできます。 'dateList.Add(CDate("平成6年7月20日")) '---> 計算処理の本体 ここから ---> '基準日から、各日付までの日数差を合計する。 Dim t As TimeSpan For Each d As Date In dateList t += (d - Date.MinValue) Next '日数差の平均値を得る Dim avg As New TimeSpan(t.Ticks \ dateList.Count) 'その平均値を、基準日に足して答えを得る Dim answer As Date = Date.MinValue + avg '<--- 計算処理の本体 ここまで <--- '日付型を和暦表記の文字列にして表示 Dim culture As New CultureInfo("ja-JP", False) culture.DateTimeFormat.Calendar = New JapaneseCalendar() Dim s As String = answer.ToString("ggy年M月d日 HH:mm:ss.ffff", culture) Console.WriteLine(s) '================================ また、上記のように TimeSpan.Ticks を使うかわりに、 DateTime.Ticks のみで処理すると、もっと単純に書けます。 '================================ Dim ticks As Long For Each d As Date In dateList ticks += d.Ticks Next Dim answer As New Date(ticks \ dateList.Count) '================================ VB2008 の場合は、さらに短く 1 行で算出する事もできます。 '================================ Dim answer As New Date(CLng((From d In dateList Select d.Ticks).Average())) '================================
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.