質問: accessで日付の比較がうまくいかない いつも楽しく勉強させていただいております。 access2013のvbaでadoを使ったシステムを作っています。 その中にある契約の月額料金に対して日割で控除額を計算する処理があります。 契約のテーブルには契約が何日~何日(from~to)まで有効であるかを格納し、 控除のテーブルには何日~何日(from~to)まで控除するかが入っています。 日割を行う前に控除のfrom~toが契約のfrom~toの範囲内であることのチェックをします。 if deduction!to > contract!to then 一連のエラー処理 exit function end if 上記のコードを実行してうまくいく時といかない時があります。 エラーでないはずなのにエラーになります。 うまくいかない時にイミディエイトウィンドウでみると、こうなっていました。 ?contract!to 2014/02/14 ?deduction!to 2014/02/13 ?deduction!to > contract!to true deduction!toは2014/02/13ですからcontract!toの2014/02/14より大きいはずはないのですが・・・。 どちらのテーブルのto列も日付時刻型です。 ためしにcdate関数を使ってみましたが、これは意図したとおりに動きました。 if cdate(deduction!to) > cdate(contract!to) then ということで何とか回避する手段はあるのですが、気持ち悪いです。 (1)どうしてこういった現象がおきるのか。 (2)adoのrecordsetを使った日付の比較は危険なのか。 (3)もっと根本的な解決法はありますか。 どなたかご存知の方教えてくださいませんか。
回答: > ためしにcdate関数を使ってみましたが 元のデータはテキスト型ということですか? 日付型のまま、大小比較するのは危ないと思います。 (1)どうしてこういった現象がおきるのか。 「たぶん」程度ですが、日付表記の文化の違いかも。 日本では「年月日」の言葉通り、yyyymmddですよね。これは大小比較しやすい。 でも合衆国ではmm-dd-yyyyだし、他の英語圏ではdd-mmm-yy。 クエリに日付を#で囲んで記述する際に#14/03/2014#と書くようです(参考url) なので > ?deduction!to > 2014/02/13 は 14/02/13 → 2013/02/14と解釈されてるのかも。 if format(deduction!to, "yyyy/mm/dd") > format(contract!to, "yyyy/mm/dd) then みたいに明示したほうがトラブルにならないと思います。(処理速度が不利としても) バージョンによるのかも、とは思いますが 1)accessでタイムスタンプ目的で年月日時分秒を記録して 2)レコードコピーして、 3)excelにペーストすると、dd-mmm-yyになる。 4)それをexcelでコピーして 5)accessにペーストすると、yyとddが逆転する。 何度か痛い目に遭いました。