none
dataview.rowfilterでdatetime型が正しくフィルタされない。 RRS feed

  • 質問

  • Dim DTview as new dataview(me.dataset1.table("tablename"))

    DTview.rowfilter = "CreationDay = #" & RefixDate & "#"

    上記のフィルタで、DTview.Count が 0 に、なります。

    ちなみに、

    DTview.rowfilter = "CreationDay = #" & RefixDate.tostring("G") & "#"

    としましたが、だめでした。

    Debug.WriteLine(DTview.item(i).item("CreationDay ") & "," & RefixDate.tostring("G") )

    の結果が以下の通りです。

    2006/06/20 14:05:05,2006/06/20 14:05:05
    2006/06/20 14:05:05,2006/06/20 14:05:05
    2006/06/20 14:05:05,2006/06/20 14:05:05
    2006/06/20 14:06:19,2006/06/20 14:05:05
    2006/06/20 14:05:05,2006/06/20 14:05:05
    2006/06/20 14:05:05,2006/06/20 14:05:05
    2006/06/20 14:05:05,2006/06/20 14:05:05
    2006/06/20 14:05:05,2006/06/20 14:05:05
    2006/06/20 14:05:05,2006/06/20 14:05:05

    ちなみに、開発環境はVS2002です。

    RowFilterでは、だめなのでしょうか?

    よろしく、お願いします。

    2006年6月20日 5:10

回答

  •  trapemiya さんからの引用

    DTview.rowfilter = "CreationDay >= #2006/06/20 14:05:05.00000# and CreationDay <= #2006/06/20 14:05:05.99999#"

    trapemiyaさんありがとうございます。

    上記の情報を元に、以下の様に書き換えた所、正常に取得出来ました。

            DTview.RowFilter = "CreationDay >= #" & RefixDate.ToString("G") & ".00000" & "# " _
                             & "OR CreationDay <= #" & RefixDate.ToString("G") & ".99999" & "# "

    ミリ秒以下は、必要が無いので、これで大丈夫です。

    VB側で、Datetime.Now() を渡した所、確かに、ミリ秒は、みごとに、".000"でした。

     YouGun さんからの引用

    DTview.RowFilter = String.Format("CreationDay = '{0}'", RefixDate)

    YouGunさん、情報が不足して、申し訳ありませんが、

    この方法も、試しましたが、だめでした。

    ちなみに、(')ではなくて、(#)を使用したのは、以下のURLの内容に、

     http://www.microsoft.com/japan/msdn/columns/data/data06142001.asp

      「日付にはシャープ記号 (#) が必要です。」

    と、記入してある事を、優先しました。

    2006年6月21日 6:21

すべての返信

  • DataTable側のCreationDayには、秒未満の値(ミリ秒とか)も入っていないでしょうか?
    2006年6月20日 10:12
    モデレータ
  • 情報ありがとうございます。

    はい、その後、SQLサーバー側の、ストアドプロシージャの変更が発生した為、クエリアナライザで、

    結果を確認していた所、ミリ秒が、ある事に気がつきました。

    という事は、ミリ秒を、なくしたデータで、取り込むしか、方法は、無いのでしょうか?

    (ちなみに、いまだにVB側で、ミリ秒の扱いが、HELPで検索しましたが、分かっていません。)

    2006年6月21日 0:15
  • >という事は、ミリ秒を、なくしたデータで、取り込むしか、方法は、無いのでしょうか?

    そういう方法もありだと思いますが、手っ取り早くは、

    DTview.rowfilter = "CreationDay >= #2006/06/20 14:05:05.00000# and CreationDay <= #2006/06/20 14:05:05.99999#"

    のような感じでいいんじゃないかと思います。
    #2006/06/20 14:05:05#は、#2006/06/20 14:05:05.00000#と同じになるんじゃないかと思いますが、明確にそれを記述している文書を見つけられませんでした。

    datetime 型と smalldatetime 型
    http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/tsqlref/ts_da-db_9xut.asp

    2.4.6 日付リテラル
    http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vbls7/html/vblrfvbspec2_4_6.asp

    2006年6月21日 2:14
    モデレータ
  •  zamachin さんからの引用

    Dim DTview as new dataview(me.dataset1.table("tablename"))

    DTview.rowfilter = "CreationDay = #" & RefixDate & "#"

    日付のフィルタって「'」いらないんでしたっけ?

    DTview.RowFilter = String.Format("CreationDay = '{0}'", RefixDate)

    のように。

    2006年6月21日 2:53
  •  trapemiya さんからの引用

    DTview.rowfilter = "CreationDay >= #2006/06/20 14:05:05.00000# and CreationDay <= #2006/06/20 14:05:05.99999#"

    trapemiyaさんありがとうございます。

    上記の情報を元に、以下の様に書き換えた所、正常に取得出来ました。

            DTview.RowFilter = "CreationDay >= #" & RefixDate.ToString("G") & ".00000" & "# " _
                             & "OR CreationDay <= #" & RefixDate.ToString("G") & ".99999" & "# "

    ミリ秒以下は、必要が無いので、これで大丈夫です。

    VB側で、Datetime.Now() を渡した所、確かに、ミリ秒は、みごとに、".000"でした。

     YouGun さんからの引用

    DTview.RowFilter = String.Format("CreationDay = '{0}'", RefixDate)

    YouGunさん、情報が不足して、申し訳ありませんが、

    この方法も、試しましたが、だめでした。

    ちなみに、(')ではなくて、(#)を使用したのは、以下のURLの内容に、

     http://www.microsoft.com/japan/msdn/columns/data/data06142001.asp

      「日付にはシャープ記号 (#) が必要です。」

    と、記入してある事を、優先しました。

    2006年6月21日 6:21
  • まぁ、いまさらですが、ミリ秒が必要ないということであれば、SELECT 時にデータを切り詰めるものあります。
    パフォーマンスの観点から微妙ですがね。

    DECLARE @dateNow
    SET @dateNow = GETDATE()
    SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), @dateNow(), 111) + ' ' + CONVERT(VARCHAR(8), @dateNow, 114)) AS DateValue

    2006年6月21日 14:24
  • おがわみつぎさん、ありがとうございます。

    実際に、試しては、いませんが、ちょっと、パフォーマンスが、悪そうですね。

    それとして、今更ながら、一つ疑問点が.....

    開発環境(私のは,VS2002ですが)からは、ミリ秒が、見えていないのは、

    不便というか、ちょっと、分からないですね。

    VB側では、ミリ秒の扱いは、無いのですかね。

    2006年6月22日 1:08