none
Access2016で日付の抽出ができない

    質問

  • Access2016でSqlServerのテーブルに接続している状態で日付の抽出betweenがうまくいきません。

    Between #17/07/01# And #17/10/01#

    結果
    04/01/09
    04/01/14
    04/01/21
    ・・・

    このように範囲外データが抽出されます。
    どのようにすればいいでしょうか?

    ちなみに
    Between #2017/07/01# And #2017/10/01#
    このように入力しても
    システムで短い日付設定にしているので
    Between #17/07/01# And #17/10/01#
    自動で修正されます。

    Windows10

    2017年10月25日 0:16

回答

  • 回答ありがとうございます。

    なんとか解決できました。

    WHERE句で 日付の抽出と 別のフィールド値をORで結んでいたのが原因のようでした。

    先に like文を OR で結んで、その結果セットを

    さらに、between句で抽出したら期待したレコードが抽出できました。

    皆様、ご回答ありがとうございました。

    • 回答としてマーク mp430ra615h 2017年10月26日 3:56
    2017年10月26日 3:55

すべての返信

  • SQL Serverであれば、"17/07/01"ではなく、'2017/07/01' で、ダメでしょうか?

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年10月25日 1:33
  • 回答ありがとうございます。

    抽出条件にデータ型が一致しません。

    と、エラーがでます。
    2017年10月25日 1:41
  • 日付時刻型のフィールドを対象としているのですよね。

    ODBC リンクテーブルの場合は Access 構文 での指定、ODBC パススルークエリーの場合は SQL Server 構文での指定が必要です。

    Microsoft Access が用いる SQL の日時リテラルは、Y/M/D の順ではなく、
     #MM/DD/YYYY#
    もしくは
     #MM/DD/YYYY hh:mm:ss PM#
    の順となる米国形式です。これは OS の地域設定とは無関係です。年の 2 桁指定にも対応していますが、リテラルの表記順が 月/日/年 を前提したものであるという点は基本的に変わりません。
    その意味において、そもそも『Between #17/07/01# And #17/10/01#』という表記は本来の構文としては間違っているわけです。とはいえ Access はそれをエラーとせず、OS の地域設定などと照らし合わせて無理矢理解釈しようとしますので、M/D/Y で判定できなかった場合には、D/M/Y か D/Y/M か Y/M/D か Y/D/M かが曖昧になってしまうわけです(04/01/14 が抽出された理由までは良く分かりませんが)。
    このほか、日付値を文字列リテラルで表現する手法もありますが、こちらは OS の地域設定に依存してしまうのでお奨めしません。

    一方 Microsoft SQL Server では「#」で囲む構文を使えません。SQL Server には直接的な日時リテラルが用意されておらず、かわりに文字列リテラル または ODBC 日時指定リテラルを用いる仕様となっています。ちなみに ODBC 日時指定リテラルとは、
     SELECT {d '2017-10-26'} AS YMD, {t '12:34:56.789'} AS HNS, {ts '2017-10-26 12:34:56.789'} AS TS
    のような指定形式です。
    SQL Server における 文字列リテラルでの日付指定では、年月日の並び順などは SET DATEFORMATSET LANGUAGEdefault language オプション の設定の組み合わせによって解釈が揺れることになりますが、一般的にはそうした設定に依存せずに、常に 年月日 順での指定となる『ISO 8601 形式』での指定が推奨されています。これはたとえば '20171026''2017-10-26'、'2017-10-26T12:34:56.789Z' といった文字列で示すことができますが、あくまでも文字列なので、型を明示したい場合は CAST か CONVERT が必要です。(とはいえ、日付型フィールドへの WHERE 問い合わせなどであれば、これらの文字列リテラルを日付値と同様に使うことができます)

    また、ODBC ドライバー側にも日付フォーマットに関する設定項目があるケースがあります。

    2017年10月26日 1:34
  • SQL Serverにはどのように接続されていますでしょうか? 接続の仕方もいろいろあります。
    パススルークエリではなさそうでが、もう少し具体的にどのように行っているかを書いていただけると、回答が付きやすくなると思います。また、SQL Serverにおける日付が入っている型の情報もお願いいたします。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年10月26日 1:39
  • 回答ありがとうございます。

    なんとか解決できました。

    WHERE句で 日付の抽出と 別のフィールド値をORで結んでいたのが原因のようでした。

    先に like文を OR で結んで、その結果セットを

    さらに、between句で抽出したら期待したレコードが抽出できました。

    皆様、ご回答ありがとうございました。

    • 回答としてマーク mp430ra615h 2017年10月26日 3:56
    2017年10月26日 3:55