5

我有一个 DBF 文件,我正在尝试从 c# 代码中读取它。我可以在不应用任何条件或为 varchar 类型字段应用条件的情况下成功读取文件。我的问题是我必须从日期字段(类型:日期)中过滤记录。我尝试了以下方法,

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() 代表字符到日期转换,并期望格式为 mm/dd/yyyy。通过只做“日期”部分,它总是意味着 12:00:00 AM。

此外,您可以使用可用的 DATE() 函数,例如 date(yyyy, mm, dd) as Date(2006, 02, 16),它也将返回此特定日期。

如果您想要一个特定的时间,您可以使用代表 Character TO dateTime 字段的 CTOT(),例如

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

不是 DBase 专家,但thisthis看起来很有希望。

于 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 语法支持“日期”字面量(例如“2/16/2006”;我不知道“日期时间”——请试一试看看。

于 2012-09-20T16:50:57.263 回答
1

这对我有用,

WHERE RDATE >= {^2016-11-01} AND RDATE <= {^2017-01-31}

我用OLEDB Connection检查了这个

于 2017-02-01T10:22:50.030 回答