Accessで日付の比較がうまくいかない

このQ&Aのポイント
  • Access2013のVBAでADOを使ったシステムを作っています。契約の月額料金に対して日割で控除額を計算する処理がありますが、日付の比較がうまくいかない問題があります。
  • エラーが発生している箇所では、控除の終了日(Deduction!To)が契約の終了日(Contract!To)よりも大きいという条件で処理が行われるはずですが、実際にはエラーが発生してしまいます。
  • 一時的な回避策として、Cdate関数を使用して日付型に変換することで正常に処理が行われることが確認されていますが、より根本的な解決法を探しています。
回答を見る
  • ベストアンサー

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)もっと根本的な解決法はありますか。 どなたかご存知の方教えてくださいませんか。

質問者が選んだベストアンサー

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> ためしに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が逆転する。 何度か痛い目に遭いました。

参考URL:
http://office.microsoft.com/ja-jp/access-help/HA102809751.aspx
meglin888
質問者

お礼

bin-chanさん、回答ありがとうございます。 >元のデータはテキスト型ということですか? いえ、どちらのテーブルもFromとToは日付時刻型です。 本来ならこのまま比較してもかまわないはずですよね。 >「たぶん」程度ですが、日付表記の文化の違いかも。 私もそんな気がしていました。 >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が逆転する。 >何度か痛い目に遭いました。 私もそういうことありました。 どうにかならないものかと思いますが他のDBMSでも日付関連のトラブルはあると 聞きますし、好きで使っているAccessなのでこれからも工夫して付き合っていきます。 ありがとうございました。

関連するQ&A

  • Accessを使って日付を比較したい

    MSofficeのAccessを使用して日付を比較したいのですが上手くいきません。 テーブル1のフィールドには実施日(日付型)、A期間開始日(日付型)、A期間終了日(日付型)があり データ1は2012/04/20、2012/04/15、2012/05/02 データ2は2012/04/25、2012/04/10、2012/04,23と格納されています。 この実施日がA期間に入るかどうかのチェックを行いたいのです。 クエリに入力した関数は IIf(CDate([テーブル1]![A期間開始日])<=CDate([テーブル1]![実施日])>=CDate([テーブル1]![A期間終了日]),"A期間","範囲外") と命令を書きました。 実行させるとデータ1、データ2とも期間外が返されました。 実際、返して欲しいデータはデータ1はA期間、データ2は期間外と表示したいのです。 環境はWindows XP profissional、アクセスは2002 SP3です。 よろしくお願いします。

  • ACCESS 日付の比較

    日付を比較してstrToDateよりstrFromDateの日付が未来日だった場合エラーを出したいのですがうまくいきません。 日付型に合わせたつもりなのですがこれだとダメなのでしょうか strFromTime = txtFromYear & "/" & Format(txtFromMonth, "00") & "/" & Format(txtFromDay, "00") strToTime = txtToYear & "/" & Format(txtToMonth, "00") & "/" & Format(txtToDay, "00") If (Format(strFromTime, yyyy / mm / dd) >   Format(strToTime, yyyy / mm / dd)) Then MsgBox MSG_ERR, vbCritical, SYSTEM_NAME Exit Sub End If

  • Access 日付の切捨て

    "20060321"などの日付をあらわす文字列を、 "20060301"など、日を全てその月の1日に置換したいのですが、どうすればいいでしょうか? 勘で以下のようにしてみたのですが、エラーになってしまいました。 year(CDate([列名]))+month(CDate([列名]))+"01"

  • oooBasic 日付の範囲比較ができない

    OpenOffice.org Basic でコーディングしているのですが、日付の範囲の比較ができません。 ダイアログで日付のエンドとスタートを指定していて、読み込んだCSVファイルのあるセルがその日付の範囲内かを調べたいです。 ----- oDateStart = oDialog.getControl("DateStart").Text oDateEnd = oDialog.getControl("DateEnd").Text ~ oFileSales(1).Value = "44,34,64,1" 'oFileSales(1).Value="44,34,64,1,1/5/1/2/1/1/1/2/1/2/1/1/1/1/1/1/1/1/1/1/1/1/5/5/1/1/1/2" ---(a) ~ oDate = oSheetSales.getCellByPosition(ColSalesDate, i-1).String 'oDate = oSheetSales.getCellByPosition(ColSalesDate, i-1).Value ---(b) ~ If oDateStart <= CDate(oDate) and CDate(oDate) <= oDateEnd Then ---(c)ここがエラーになります。 処理 End if ----- oDateStart と oDateEnd は、ダイアログで指定した日付のテキスト(形式:YYYY/MM/DD(String))で、oDate は、読み込んだcsvファイルの日付(形式:MM月DD日(String))です。 『OpenOffleへの道』には CDate と DateValue は、"年""月""日"が入ったものは×とあります。 oDateのセルは、OpenOfficeで普通に開くと、"2012/12/12"のように表示されるのですが、マクロの中で開くと、なぜか"12月12日"となってしまいます。 (a)のように、読み込む列の書式を指定しても同じでした。 逆に、(b) のように oDateをシリアル値で取得して、シリアル値で比較できればと色々トライしましたが、oDateStart と oDateEnd のシリアル値への変換がわからず断念。 何かよい方法はないか、お知恵をお貸し頂けないでしょうか。 よろしくおねがいします。

  • Access ADOで文字列を日付型へinsert

    VBScriptでCSVファイルのデータをADO経由でAccessにinsertしたいのですが、日付型へのinsertがうまくいきません。 CSVファイルにある「8桁日付」(例:20110101)をAccessの日付型フィールドへinsertするのに、以下の試みをしましたが、型不一致etcのエラーがでてしまいました。 どうしたら、insertできるのでしょうか? 1.8桁日付を yyyy/mm/dd に編集(mid使用) してinsert →型不一致エラー 2.CDATE(yyyy/mm/dd) をinsert →型不一致エラー 3.CDATE(#yyyy/mm/dd#) をinsert →型不一致?エラー ハマってしまって困っています。ご存知の方がいらっしゃいましたら是非是非教えてください。

  • アクセス 数値+日付をyyyy/mm/dd(aaa

    テーブルに 20121201aaa 20121203bbb と言うデータがあるのですが これをクエリで あ2012/12/01(土) あ2012/12/03(月) に変えるにはどうすればいいでしょうか 数値の後ろの文字はいろんなパターンがあるので置換じゃ追いつきません。 SELECT Format(Left([テーブル1]![test],8),"yyyy/mm/dd(aaa)") AS 日 FROM テーブル1; にすると#エラーになってしまいます。 SELECT Format(CDate(Left([テーブル1]![test],8)),"yyyy/mm/dd(aaa)") AS 日 FROM テーブル1; これでもダメでした・・・

  • ACCESS フォームで入力した日付をクエリで読み

    ACCESS フォームで入力した日付をクエリで読み替えたい ACCESS フォームで入力した日付をクエリで使用しているテーブルの書式に変換したい フォーム テキスト名:日付にyyyymmdd で入力します クエリ テキスト名:日付はパラメータとして使用しています クエリ内で使用しているテーブルの日付書式は 日付:yyyy/mm/ddです パラメータは 「日付始」と「日付終」の2箇所のテキストに入力されたデータを使用しています。以下がパラメータです。 Between [Forms]![フォーム]![日付始] and [Forms]![フォーム]![日付終] フォームのテキストボックスにyyyymmddと入力してもクエリでエラーが出ることない パラメータを日付に設定したいのですがどうしたらよいでしょうか? ちなみに、以下の式を入れたらエラーです。 Between CDate(Format([Forms]![フォーム]![日付始],"yyyy/mm/dd")) and CDate(Format([Forms]![フォーム]![日付始],"yyyy/mm/dd")) と入力しましたところ、、、、「式が複雑すぎるか、、、」のエラーメッセージが出てしまいました。 どなたか助けてください。お願い致します。

  • 日付型について

    Oracleの日付型で苦労しております。 教えてください。 言語 ASP(VBscript) データベース Oracle 下記のようなプログラムを作成しました。 STARTTIME=CDate(2010/2/16 13:00:00) SYURYOTIME=CDate(2010/2/16 14:00:00) SQL="SELECT * FROM TABLE " SQL=SQL & "WHERE TO_CHAR(Field,'yyyy/mm/dd HH24:MI:SS') BETWEEN '" & STARTTIME & "' AND '" & SYURYOTIME & "'" Set rs0 = OraDatabase.DbCreateDynaset(SQL, 0) この場合は予想通りの結果を返します。 しかし、時刻を10時以前の STARTTIME=CDate(2010/2/16 08:00:00) SYURYOTIME=CDate(2010/2/16 09:00:00) にすると予想外の結果を返しません。 これは、Oracle側の形式"2010/2/16 08:00:00"で、 CDate関数側が"2010/2/16 8:00:00"となってしまうためと考えていますが、対応方法がわかりません。 何卒、ご教授くださいますようお願い致します。

  • ACCESSの日付変換

    アクセスDBのテキスト型で来館日というテキスト型の8桁日付入っているフィールド(例18731023のような)があり、これを帳票タイプのフォームでyyyy/mm/ddで表示させようと思い、 =CDate(Format([来館日],"@@@@\/@@\/@@")) これでうまくいったのですが、 この来館日フィールドにはNullも入るのでNUllでエラーが返ってきてしまいます。これを空白のままで表示する方法がわかりません。 どなたかご教授おねがいいたします。

  • Accessで日付を抽出するパラメータを設定したい

    Accessのクエリで日付に対して与えているパラメータがあります。 パラメータで指定したいデータはフォームのテキストに入力した日の23:59:59 以降の日付を抽出したい。 入力:数値8桁(yyyymmdd)で行う 抽出先テーブルのデータ:yyyy/mm/dd hh:mm:ss 現在以下のパラメータを日付に対して与えると「式が複雑すぎます、、、」と注意されてしまいます。 指定日の23:59:59を抽出範囲として指定するのはどうしたらよいでしょうか? 入力値の変換も含めて、以下のパラメータを入れています。 「+"23:59:59"」をとればエラーは出ません。 <=IIF(Len([Forms]![フォーム名]![日付])=8,CDate(Format([Forms]![フォーム名]![日付],"@@@@/@@/@@")),#9999/1/01#)+"23:59:59" どなたか、お助け下さい。よろしくお願い致します。