5

DBF ファイルがあり、C# コードから読み取ろうとしています。条件を適用したり、varchar 型フィールドに条件を適用したりしなくても、ファイルを正常に読み取ることができます。私の問題は、日付フィールド (type:date) からレコードをフィルター処理する必要があることです。私は次の方法を試しました、

SELECT * FROM D:\DBFreader\file.dbf where [RDATE] between 2/16/2006 12:00:00 AM and 2/20/2006 12:00:00 AM

上記の構文エラー: 演算子がありません

SELECT * FROM D:\DBFreader\file.dbf where [RDATE] between '2/16/2006 12:00:00 AM' and '2/20/2006 12:00:00 AM'

上記はデータ型の不一致エラーを返します

SELECT * FROM D:\DBFreader\file.dbf where [RDATE] between 2/16/2006 and 2/20/2006

上記は例外をスローしませんが、一致するレコードがあってもレコードを返しません。

同じことが where 句でも起こります。範囲からレコードをフィルタリングするにはどうすればよいですか

私はそれを読むために次のコードを使用しています

OdbcCommand cmd = new OdbcCommand();
OdbcDataAdapter da = new OdbcDataAdapter();
DataTable dt = new DataTable();

using (OdbcConnection connection = new OdbcConnection(connstring))
{
   connection.Open();
   cmd = new OdbcCommand(@"SELECT * FROM D:\DBFreader\file.dbf where [RDATE] between 2/16/2006 12:00:00 AM and 2/20/2006 12:00:00 AM", connection);
   cmd.CommandType = CommandType.Text;

   da.SelectCommand = cmd;
   da.Fill(dt);
}
4

4 に答える 4

4

BETWEEN の dbase/Foxpro 構文 (および同じデータ型のいずれかで機能する) は次のとおりです。

BETWEEN( SomeValue, MinRange, MaxRange )

あなたのクエリは次のように行うことができます

where between( [RDATE], ctod( '02/16/2006' ), ctod( '02/20/2006' ))

以前の DBase および VFP フォワードでは、CTOD() は Character To Date 変換を表し、mm/dd/yyyy のような形式を想定しています。「日付」部分だけを実行すると、常に午前 12:00:00 を意味します。

さらに、date( yyyy, mm, dd ) as Date( 2006, 02, 16 ) などの DATE() 関数を使用して、この特定の日付を返すこともできます。

特定の時間が必要な場合は、次のような Character TO dateTime フィールドを表す CTOT() を使用できます。

CTOT( "2012-09-20T15:16:21" )  = Sep 20, 2012 @ 3:16:21pm
于 2012-09-20T19:19:06.690 に答える
3

DBase の専門家ではありませんが、これこれは有望に見えます。

于 2012-09-20T06:36:42.833 に答える
3

わかった -

問題は、dBase/xBase が SQL 日付の「間」をサポートしていないことだと思います

回避策:

@"SELECT * FROM D:\DBFreader\file.dbf where [RDATE] >= #2/16/2006 12:00:00 AM# and [RDATE] < #2/20/2006 12:00:00 AM#"

PS: dBase 構文が "date" リテラルをサポートしていることは知っています (例: "2/16/2006"; "datetime" については知りません - 試してみてください。

于 2012-09-20T16:50:57.263 に答える