• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:日付のデータ型について)

日付のデータ型についての疑問

このQ&Aのポイント
  • 日付のデータ型が異なる場合、同じ日付でもマッチングしないことがあります。
  • SQL 2008では、smalldatetimeは1990/1/1を起点とし、datetimeは1753/1/1を起点とします。
  • ACCESS 2003では、dateは100/1/1を起点とします。なぜdate型のフィールドではマッチしないのか疑問です。

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

プロバイダは外のデータとの受渡のインターフェースを提供するものです。 mdbにせよ、adpにせよ、直接SQL Serverのデータにアクセスできるわけではありません。 複数提供されているプロバイダのいずれかを使ってSQL Serverにアクセスして、データのやり取りをしているわけです。 SQL Serverの場合、一般的に使われているのが、 ・Microsoft OLE DB Provider for ODBC(MSDASQL) ・Microsoft OLE DB Provider for SQL Server(SQLOLEDB) ~最も一般的 ・Microsoft SQL Server Native Client(SQLNCLI)     ~SQL Server 2005対応 ・Microsoft SQL Server Native Client 10.0(SQLNCLI10) ~SQL Server 2008対応 ポイントは以下の2点だと思います。 ・DATE型はSQL Server 2008で登場したデータ型であり、それ以前には存在しなかったこと  (したがって、それ以前に提供されているプロバイダはDATE型に対応していない   =呼び出し元のアプリケーションで問題なく使えるような形で返すことを保証していない) ・MicrosoftのAccess開発チームは、SQL Server 2008に対応できる十分なインターフェースの提供をadpに関して行っていない  (これはOffice2007でも同じ。内部的にはSQLOLEDB固定で使っていると思います) したがって、adpでDATE型を使うこと自体をやめた方がいいと私は思っています。 なお、smalldatetimeかdatetimeかについては、ストレージに余裕がなければsmalldatetime、それ以外ならdatetimeでいいと思います。 理由は以下の2点です。 ・datetime型の方が優先順位が高いから  (datetime型とsmalldatetime型の間で演算をすると、smalldatetime型はdatetime型に暗黙変換されます) ・すべてのテーブルで共通して同じ型を使うようにしておいた方が開発上コントロールしやすいから ご参考までに。

SEsyo
質問者

お礼

ありがとうございます。 smallもやめて、全て Datetime型 に統一する事にします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

CREATE TABLE dttbl (DT1 datetime,DT2 smalldatetime,DT3 date) GO INSERT INTO dttbl VALUES ('2009/10/31','2009/10/31','2009/10/31') GO --VB/VBAソース Sub test()  Dim adCon As New ADODB.Connection  Dim adRS As New ADODB.Recordset ' adCon.Open "Provider=SQLOLEDB;Data Source=(インスタンス);Initial Catalog=(データベース);User ID=(ユーザID);Password=(パスワード)" ' adCon.Open "Provider=SQLNCLI;Data Source=(インスタンス);Initial Catalog=(データベース);User ID=(ユーザID);Password=(パスワード)" ' adCon.Open "Provider=SQLNCLI10;Data Source=(インスタンス);Initial Catalog=(データベース);User ID=(ユーザID);Password=(パスワード)"  adRS.Open "SELECT * FROM dttbl", adCon  Do Until adRS.EOF   MsgBox adRS.Fields("DT1").Type   MsgBox adRS.Fields("DT2").Type   MsgBox adRS.Fields("DT3").Type   adRS.MoveNext  Loop  adRS.Close  adCon.Close  Set adRS = Nothing  Set adCon = Nothing End Sub ・SQLOLEDB/SQLNCLIの場合  DT1のType:adDBTimeStamp(135)  DT2のType:adDBTimeStamp(135)  DT3のType:adVarWChar(202) ・SQLNCLI10の場合  DT1のType:adDBTimeStamp(135)  DT2のType:adDBTimeStamp(135)  DT3のType:adDBDate(133) これが「プロバイダが新しい型をサポートしていない」ということの意味です。型が判断できないので文字型として返しています。 文字型と判断されている間は、キャストされない限りシリアル値云々というのは関係がないということでしょう。

SEsyo
質問者

お礼

ありがとうございます。 昨日試していて「文字列として比較しているのではないか」と 云う所までたどりつけました。 Date型のみSQL側で「/」が「-」に変わって格納されてしまい文字列と 比較してマッチしないようです。 比較時にFormat関数で「yyyy-mm-mm」の形で指定するときちんと マッチします。 ただ、Findでは上記の状況ですが、Dlookup等の定義域集計関数では Format関数を使わなくても正常にマッチするようです。 これはプロバイダの関係なんでしょうか? (プロバイダと云うものを理解できていません、それでも動いているので なかなか勉強するに至って降りません) いまいちスッキリしておりません、単純な日付をdatetimeにするか smalldatetimeにするかで悩みぶり返してしまいました(^^;

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Datetime型とDate型

    SQLServer2008 ですが、日付のフィールドにこれまで使っていたDatetime型をDate型にしてみました。 連結Formでの画面表示が「2009/07/27」→「2009-07-27」に変わりました。 テーブルの表示時も同様に「-」になりました。   Dim wk_date date   if SQL_date = wk_date then   ・・・ 上記のAccessVABのIF文で・・・ 実際には同じ日付なのにマッチしなくなってしまいました。 Format関数で「yyyy-mm-dd」へ変換すればマッチします。 上記のwk_dateをSQLのフィールドに代入し書き込むとエラーにならず 「yyyy-mm-dd」の形へ変換されています。 質問 (1) 「-」でなく今まで通りの「/」にする事は出来ないでしょうか? (2) 比較時は変換するしかないのでしょうか?   (代入時は自動的に変換できているのに比較時も自動でやってくれても良さそうなんですが・・・)

  • 日付だけを見てデータをSELECTしたい

    お世話になっております。 開発環境:MySQL3.23.58にて、DATETIME型で日付をYYYY-MM-DD hh:mm:ssで登録しています。 そこから、下のように SELECT * FROM テーブル名 WHERE DATE( フィールド名 ) = '2007-09-12'; などと、日付だけを見てデータを抽出したい(時間は無視したい)のですが、マニュアルを見ると 『DATE() は MySQL 4.1.1 以降で使用できる。』 と書いてあり、やり方が分からず途方にくれております。 上記環境下で、うまく日付のみを見てデータを抽出する術は無いものでしょうか。 アドバイスをいただけたらと思います。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 「システム日付」を挿入する

    フィールドに「システム日付」を挿入するSQLを作成する方法が分かりません。 GETDATE()という関数を使えばいいらしいですが、どのようにすれば良いでしょうか? INSERT文を使ってdatetime型の値が入る列に挿入するという形式です。

  • ACCESSの日付について

    こんにちは。 Access2000を使用しています。 フォームで、完了のチェックをしたときに[完了日]のフィールドに 今日の日付を取得するようにしたいのですが、 (1)マクロで、値の代入-[完了日]のフィールドに=Dateで  日付を入れるようにしました。 (2)フォームのチェックボックスをクリックすると、上記のマクロが  実行されるようにした。 を行うと、1899年などという日付がでてきます。 パソコンの内蔵時計を確認しましたが、2002年の今日の日付に なっています。 どなたかよろしくお願いします。

  • フィールドプロパティの規定値で日付関数を使うには

    フィールドプロパティ規定値で日付関数を使うにはどうしたらよいでしょう?(アクセスプロジェクト) SQL Server 超初心者です。 アクセスならdate()やnow() ですが、これだと dateは関数名として認識されません・・とエラーになります。

  • Access SQL日付時間型検索

    Accessで以下SQLを書いたのですが SQLC = "SELECT * FROM tbl_data where date_end = #"&tmp_date_end&"#" ”引数が間違った型、許容範囲外、または競合しています。 ” とですます。 何か書き方の誤りがあるのでしょうか? テーブル名 tbl_data のフィールド名date_end から変数tmp_date_endと同一データ検索文です。 DBの型は日付時間型です。 変数はyyyy/mm/ddです。

  • 日付時刻型の比較

    お世話になります。コンピュータ歴が短いもので質問の意味がよくわからないかもしれませんがよろしくおねがいします。 accessのDB「テーブル1」に日付時刻型のフィールド「フィールド1」があり、 2001/00/00 00:00:00の形式でデータが入っています。 テーブル1のデータで、1ヶ月前のデータより新しいもののみをVBScriptで抜き出したいのですが、下記のようにDATEADD関数で変数1に1ヶ月前の日付を代入し、それと比較しようとしましたが、うまくいきませんでした。 変数1 = DATEADD("m" ,-1 ,NOW) Set rs = Server.CreateObject("ADODB.RecordSet") sql = "SELECT * FROM テーブル1 WHERE フィールド1 >= 変数1" 変数1をResponse.Writeすると見た目は同じ形式で入っていました。 変数1の部分を手書きで#2001/00/00 00:00:00#と書けばうまく動いてくれるの ですが・・・ 変数の値を型変換しなければいけないのでしょうか? 良い方法がありましたら教えてください。

  • 日付や日時を格納する場合の型はどうしていますか?

    WEBアプリケーションで データベース(MySQL)を使うのですが、 日付や日時を格納する場合の型は varchar(10)、date、datetime のどれにしていますか? 文字型と日付型か迷っているので、 メリット、デメリットがあれば知りたいです。

    • ベストアンサー
    • MySQL
  • SQL Serverへの日付のINSERT文

    VB6 SP6でSQLServerのdatetimeに日付をinsertしたいのですが、 VBのDate型の DATE = #2008/02/06# '日付 TIME = #19:00:00# '時間 これをどのようにすれば書き込めるのでしょうか。 環境 WindowsXP Pro SP2 Visual BASIC 6.0 SP6 SQL Server 2005 Express Edition

  • Accessの日付/時刻型のデータ変換について

    Accessで日付/時刻型で持っているデータを整数型に変換したいと思っておりますがうまくいきません。 日付/時刻型の「時刻(S)」でテーブル上にデータを入れています。これを整数に変換したいと思っています。 例)10:20 → 1020 そこで、 CInt([変換したいフィールド名]) をクエリで実行してみたのですが、結果は「0」、「1」、「#エラー」が表示され、変換したい形に変換することができませんでした。 どのようにしたら、例にある変換の仕方ができるのか教えて頂けますでしょうか。宜しくお願いいたします。