как запросить поле типа даты файлов DBF (dbase) в предложении where и between

У меня есть файл DBF, и я пытаюсь прочитать его из кода С#. Я могу успешно читать файлы без применения каких-либо условий или применения условий для полей типа 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);
}

person user1450810    schedule 20.09.2012    source источник
comment
В: Что такое файл .dbf? В какой программе вы их создавали?   -  person paulsm4    schedule 20.09.2012


Ответы (4)


OK -

Я считаю, что проблема в том, что 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 поддерживает литералы «даты» (например, «16.02.2006»; я не знаю о «datetime» — пожалуйста, попробуйте и посмотрите.

person paulsm4    schedule 20.09.2012
comment
на самом деле он поддерживает между, проблема была в том, что я не использовал знак #, чтобы окружить значение даты и времени. Теперь он работает нормально. Спасибо --SELECT * FROM D:\DBFreader\file.dbf где [RDATE] между 16.02.2006 00:00:00# и 20.02.2006 12:00:00# - person user1450810; 21.09.2012

Синтаксис dbase/Foxpro для BETWEEN (и работает с любыми одинаковыми типами данных):

BETWEEN( SomeValue, MinRange, MaxRange )

так что ваш запрос может быть выполнен как

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

в старых версиях DBase и VFP CTOD() означает преобразование символов в дату и ожидает в формате мм/дд/гггг. Выполняя только часть «дата», это всегда подразумевает 00:00:00.

кроме того, вы можете использовать доступную функцию DATE(), например дату (гггг, мм, дд) как дату (2006, 02, 16), которая также вернет эту конкретную дату.

Если вам нужно конкретное время, вы можете использовать CTOT(), который представляет поле Character TO dateTime, например

CTOT( "2012-09-20T15:16:21" )  = Sep 20, 2012 @ 3:16:21pm
person DRapp    schedule 20.09.2012

Не эксперт по DBase, но это и это выглядит многообещающе.

person AxelEckenberger    schedule 20.09.2012

Это сработало для меня,

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

Я проверил это с помощью OLEDB Connection.

person Risky Pathak    schedule 01.02.2017