• ベストアンサー
  • 困ってます

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

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数2710
  • ありがとう数13

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

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

> ためしに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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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 日付の比較

    日付を比較して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 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 →型不一致?エラー ハマってしまって困っています。ご存知の方がいらっしゃいましたら是非是非教えてください。

  • 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 フォームで入力した日付をクエリで読み

    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"となってしまうためと考えていますが、対応方法がわかりません。 何卒、ご教授くださいますようお願い致します。

  • EXCELでいうシリアル値をACCESSで出したい

    質問タイトルの通りです。VBAでFORM中の2つの日付を比較し、処理を分岐させたいのです。 自分なりに作っては見たのですが、ちゃんと動きません。どこが悪いんでしょう。 ' Dim hiduke As Integer: hiduke = CInt(IsDate(Forms![F_売上伝票]![日付])) ' Dim open_date As Integer: open_date = CInt(CDate("#2003 / 5 / 5#")) ' If hiduke <= open_date Then '正しい日付が入っていない場合には、 ' Forms![F_売上伝票]![入力日] = Date ' MsgBox "OPEN前です", vbInformation ' End If

  • 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" どなたか、お助け下さい。よろしくお願い致します。

  • ACCESSで今日の日付を自動入力したい

    ACCESS2000を使用しています。 [見積書番号][見積書作成日]などの項目があるテーブルから クエリー→フォームと作成しました。 やりたいことは フォームで[見積書番号]が入力されると[見積書作成日] に自動的に"今日の日付"が入力されるようにしたいのです。 (できれば[見積書番号]が変更された場合も[見積書作成日]が変更されるように) 下記のコードを フォームの[見積書作成日]の「更新前処理」に書きましたが エラーは出ませんが、何の反応もありません。 どこが間違っているのでしょうか? VBAはあまり詳しくないのでアドバイスお願いいたします。 Private Sub 見積書作成日_BeforeUpdate(Cancel As Integer) If [見積書番号] <> Null Then [見積書作成日] = Date ElseIf [見積書番号] <> OldValue Then [見積書作成日] = Date Else End If End Sub

  • VBでSQL

    SQLでテーブル1に該当レコードがなければインサート あればアップデートをする処理をしたいのです IF ??? THEN UPDATE テーブル1 SET SELECT * FROM テーブル2 WHERE 条件 ELSE INSERT INTO テーブル1(SELECT * FROM テーブル2) END IF ???はプライマリキーで判定をしようと考えています こんな感じでやろうとしたところ うまくいきませんでした VB上で実行しよううとしているからなのでしょうか? ADOでSQLサーバに接続しています 条件分岐もどういう条件(VBでの書き方)がわからないです。 よろしくお願いします。

  • Accessへ日付をINSERT

    今Access2000のテーブルから文字として受け取ったデータを 同じくAccessの別テーブルの日付型にINSERTしようとしています。 ソフトはVC6.0を使用しています。 受け取るSELECTはうまくできています。 UCHAR sqlstr [ ] ="INSERT INTO テーブル名"           "(カラム1、カラム2、カラム3)"           "VALUES(?,?,?)"; INSERTはこのようにSQL文を用意しておいてSQLExecuteで SQL文を実行しようとしています。 この場合にカラム1が日付型だとしたら、 「?」のパラメータには文字として渡し、 SQL文のなかで "VALUES(to_date(?,'YYYYMMDD'),?,?)"; とすればうまくいくと思ったのですができません。 いろいろサイトを見るとAccessでは「’」ではなく「#」を使うと 書いてあったので to_date(?,#YYYYMMDD#) とやったのですがエラーになってしまいます。 ちなみにパラメータとして渡す文字列は「20020413」という 8桁の普通の文字です。 どなたか知っている方いませんでしょうか? 他に方法があればそれでも構いません。 どうか教えてください。m(__)m どうしても先へ進めません…。