Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Access 2010)
計算結果を意図通りにしたい
投稿日時: 18/02/15 01:00:08
投稿者: ashi

ある会に出た人への謝礼を計算します。
3時間以内のとき12000円、6時間以内のとき18000円、6時間を1秒でも超えたら24000円にしたいです。
ところが3時間のとき18000円になってしまいます。6時間のとき24000円になってしまいます。
どこが悪いでしょうか。
 
 
謝金: IIf(FormatDateTime([T01]![退出時間]-[T01]![参加時間])<="3:00",12000,IIf(FormatDateTime([T01]![退出時間]-[T01]![参加時間])<="6:00",18000,24000))

回答
投稿日時: 18/02/15 09:48:42
投稿者: sk

引用:
FormatDateTime([T01]![退出時間]-[T01]![参加時間])

まずこの関数の戻り値として、どのような文字列が返されているかを
ご確認されることをお奨めします。
 
引用:
どこが悪いでしょうか。

引用:
FormatDateTime([T01]![退出時間]-[T01]![参加時間])<="3:00"

・FormatDateTime というコントロールパネルの設定に
 依存している関数を用いている。
 
・右辺の時刻文字列の時間パートが 2 桁固定で
 ゼロ埋めされていない。
 
・(日付/時刻書式が異なる文字列同士で)
 文字列比較を行なっている。
 
(修正例)
-----------------------------------------------------------------------------
謝金: Switch(DateDiff("s",[T01]![参加時間],[T01]![退出時間])<=10800,12000,
             DateDiff("s",[T01]![参加時間],[T01]![退出時間])<=21600,18000,
             True, 24000)
-----------------------------------------------------------------------------

回答
投稿日時: 18/02/15 10:10:44
投稿者: Suzu

1. それぞれ、
    [T01]![退出時間]
    [T01]![参加時間]
   どんな データ型 で 、どんな値が入っているのでしょう。
 
2.FormatDateTime
   【FormatDateTime 関数】
      https://msdn.microsoft.com/ja-jp/library/cc410230.aspx
    引数、引数を省略した場合 どうなりますかね。
 
3. FormatDateTime([T01]![退出時間]-[T01]![参加時間]) の 戻り値ですが 文字列型です。
   文字列型を、「数値」と同じようには判定できませんよ。
 
   戻り値が、仮に "12:00"の場合、 IIf("12:00"<="3:00","正","誤")
   さあ。正でしょうか。誤でしょうか。
    文字列として判定すると、一文字目の「1」と「3」の比較 になり、正となります。
   求める結果とは違いますよね。
   「数値」として判定するか、0詰めの文字列として比較するか のどちらかになります。

投稿日時: 18/02/15 23:25:22
投稿者: ashi

ありがとうございます。
文字列の比較になっていることを知りました。
 
sk様
DateDiffをお教えくださりありがとうございます。
やってみたら結果はうまくできました。
質問ですが、式の中に10800、21600という数字があります。
それらの数字の意味合いが考えてもわからないので教えてくださいますか。

回答
投稿日時: 18/02/16 09:28:54
投稿者: sk

引用:
質問ですが、式の中に1080021600という数字があります。
それらの数字の意味合いが考えてもわからないので教えてくださいますか。

どちらも単なる秒数です。
 
引用:
3時間以内のとき12000円

3 * 60 * 60 = 10800 秒
 
引用:
6時間以内のとき18000円

6 * 60 * 60 = 20160 秒
 
引用:
6時間を1秒でも超えたら24000円にしたいです。

以上の記述から秒単位での比較を行なう必要があると
考えられるため、
 
引用:
DateDiff("s",[T01]![参加時間],[T01]![退出時間])

DateDiff 関数の第 1 引数 interval に "s" を渡して、
[参加時間]と[退出時間]の時間差を秒単位で取得するようにし、
 
引用:
DateDiff("s",[T01]![参加時間],[T01]![退出時間])<=10800,12000

関数の戻り値が 10800 秒(= 3 時間)以下である場合は 12000 を、
 
引用:
DateDiff("s",[T01]![参加時間],[T01]![退出時間])<=21600,18000

20160 秒(= 6 時間)以下である場合は 18000 を、
 
引用:
True, 24000

上記のどちらの条件にも該当しない場合は 24000 を返すよう、
Switch 関数のそれぞれの引数を設定しています。

投稿日時: 18/02/17 08:21:18
投稿者: ashi

interval が"s"だから10800秒、、なのですね。
switch関数の使い方にも感動いたしました。
ありがとうございました。