- ベストアンサー
Access にて "mm:ss.0" 形式の 秒数を算出する方法
現在、Accessにて "mm:ss.0" 形式 の時刻データを秒数に変換する クエリの作成を試みていますが、小数点以下の秒数の算出方法が わからず困っています。 (MS-Access 2002) Excelでsecond関数を使用し、秒数を算出した場合は以下の通り、 秒数により小数点以下の扱いが異なります。 <Excelにてsecond関数を使用して秒数を計算した結果> ・00:13.5 …… 14秒(少数が丸められる) ・00:14.5 …… 14秒(少数が切り捨てられる) ・00:14.6 …… 14秒(少数が丸められる) Accessでは"mm:ss.0" というフォーマットが見当たらず、 Second関数も「抽出条件でデータ型が一致しません」と エラーとなってしまいます。 参考までに試行錯誤の軌跡を載せますが、以下のようなクエリを 作成しても、小数点の丸め処理が秒数によって.5と.6の場合があり、 やはり誤差が出てしまいます。 ** Val(Left([時刻], 2)) * 60 + Val(Mid([時刻],4 , 2)) + Round(Val(Right([時刻], 1)) / 10, 0) ※[時刻]カラムは"mm:ss.0"形式の文字列 ** AccessのクエリにてExcelのsecond関数と同様の結果を 得るにはどのようにすればよろしいでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
問題とされている点が良く判りません。VBAのRound関数はMS-Access 2000で「最近接偶数への丸め」なので多分2002でも同様だと思います。すると Debug.Print Round(13.5), Round(14.5), Round(14.6) の結果は 14 14 15 となりますが、それ以上にどのようになればよいのでしょうか?
その他の回答 (2)
- ntaka
- ベストアンサー率33% (1/3)
N0.2 です。数値を間違ってました。2→4 **** または Val(Left([時刻], 2)) * 60 + Val(Right([時刻],4))
お礼
ご回答ありがとうございます。 NO1の方のお礼に書きましたが、ミリ秒の丸め処理をExcelとAccessで合わせたいのです。 ※質問文が不適切でした。申し訳ありません。
- ntaka
- ベストアンサー率33% (1/3)
Val(Left([時刻], 2)) * 60 + Val(Mid([時刻],4)) または Val(Left([時刻], 2)) * 60 + Val(Right([時刻],2)) で、どうでしょうか?
お礼
ご回答ありがとうございます。 「最近接偶数への丸め」の知識が不足していました。 調査したところ、丸め処理を行うプロシージャの作成方法が公開されていたので、 記載内容に基づいて丸め処理を実装しましたが(BRound関数を利用)、結局、浮動小数点演算での誤差を吸収することができませんでした。 ExcelのRound関数と申しましたが違いました。 実現したいことはRound関数と同様の結果を求めたいのではなく、Excelが自動で丸め処理を行った結果とAccessでの丸め処理結果を合わせたいのです。 ※タイトル文が不適切でした。申し訳ありません。 http://support.microsoft.com/default.aspx?scid=kb;ja;196652 以下の(A)と(B)はイミディエイトペイン内でBround関数を実行した結果です。 使用している数字、型は同じはずですが誤差が生じました。 やはりAccessにてExcelと同様の結果を再現するのは難しい、ということになりますね。 ■"00:01:48.5"を秒数に変換する例 ※Excelでは00:01:48.5をセルに入力すると自動的に00:01:49に丸められます (A) ? bround((CDbl(TimeValue("00:01:48")) + 5 / 864000) * 86400) 108 (B) ? bround( 1.25578703703704E-03 * 86400) 109 (参考) ? CDbl(TimeValue("00:01:48")) 0.00125 ? 1 / 864000 1.15740740740741E-06 ? CDbl(TimeValue("00:01:48")) + 5 / 864000 1.25578703703704E-03