2015-05-07 3 views
1

я использую ADO для того, чтобы выполнять запросы SQL в базе данных файла Excel и у меня есть проблемы при помощи следующего запроса:SQL запросов на основе даты файла Excel базы данных

strQuery = "SELECT NUM,CREATION_DATE,CREATOR,STATE,LAST_MODIFICATION_DATE,LAST_MODIFIER,CATEGORY,MODEL_LABEL FROM [MySheet$] WHERE CREATION_DATE<='" + EndDateTextBox.Value + "' AND CREATION_DATE>='" + BeginDateTextBox.Value + "'" 

запрос выполняется, но Я не получаю никакого результата, когда я ввожу 2010-01-01 в BeginDateTextBox и 2016-01-01 в EndDateTextBox, что ненормально, потому что даты в моей базе данных меняются в период с 2014 по 2015 год.

Снимок экрана из столбца CREATION_DATE моей базы данных:

enter image description here

PS: Я знаю, что использование файлов Excel в качестве базы данных не является лучшей практикой, но мне говорят об этом.

+0

Проверьте формат даты. Попробуйте поместить его в формат '01/01/2010', чтобы увидеть, работает ли это. – Sam

+0

вам нужно преобразовать дату в правильный формат даты (dd/mm/yyy hh: mm: ss) –

+0

Я пробовал эти два решения, он не работает – otus

ответ

0
convert(datetime,CREATION_DATE,103) >= convert(datetime, BeginDateTextBox.Value ,103) 

ли это для обоих begindatetextbox и enddatetextbox

Это должно преобразовать обе даты в дд/мм/формат гггг (не 100% уверен, что, если он работает с датами вы, возможно, потребуется преобразовать в строку первой), поэтому вы можете сравнить их в том же формате

Это прямо в sql (за исключением begindatetextbox.value), так что это не сработает, вам нужно будет создать свою строку в коде, чтобы выглядеть так: конец

+0

Я получаю эту ошибку при попытке этого решения: ошибка -2147214900 Функция «конвертировать» не определена в выражении (я перевел сообщение об ошибке с французского) – otus

+0

хорошо, дайте мне понять, почему это не работает, и я буду вернитесь к вам –

+0

btw какая у вас база данных? mysql, oracle, доступ? –

1

Вам необходимо преобразовать даты до значений, ADO не может распознать формат ячеек в листе, только применимые значения. Так окончательный запрос должен быть чем-то вроде этого:

SELECT * FROM [MySheet$] WHERE CREATION_DATE <= 42370 AND CREATION_DATE >= 40179 

вы можете достичь этого, используя такой метод:

Sub test() 
Dim DtStart as Long 
DtStart = Clng(Cdate("2010-01-01")) 
Msgbox DtStart 
End Sub 

так, окончательный SQL запрос будет:

strQuery = "SELECT NUM,CREATION_DATE,CREATOR,STATE,LAST_MODIFICATION_DATE,LAST_MODIFIER,CATEGORY,MODEL_LABEL " & _ 
      "FROM [MySheet$] " & _ 
      "WHERE CREATION_DATE <= " & CLng(CDate(EndDateTextBox.Value)) & _ 
      " AND CREATION_DATE >= " & CLng(CDate(BeginDateTextBox.Value)) 

или может будет выглядеть следующим образом:

strQuery = "SELECT NUM,CREATION_DATE,CREATOR,STATE,LAST_MODIFICATION_DATE,LAST_MODIFIER,CATEGORY,MODEL_LABEL " & _ 
      "FROM [MySheet$] " & _ 
      "WHERE CREATION_DATE BETWEEN " & _ 
      CLng(CDate(BeginDateTextBox.Value)) & " AND " & CLng(CDate(EndDateTextBox.Value)) 

здесь результат теста:

enter image description here

+0

Как я могу преобразовать даты в базу данных в SQL-запрос? – otus

+0

@otus вам не нужно преобразовывать даты в базу данных, вам нужно преобразовать даты из текстовых полей в значения, поэтому '2010-01-01' должен быть' 40179' – Vasily

+0

Я изменил свой запрос на: 'strQuery =" SELECT NUM, CREATION_DATE , CREATOR, STATE, LAST_MODIFICATION_DATE, LAST_MODIFIER, CATEGORY, MODEL_LABEL FROM [MySheet $] WHERE CREATION_DATE <= '"+ CStr (CLng (CDate (EndDateTextBox.Value))) +"' AND CREATION_DATE> = '"+ CStr (CLng (CDate (BeginDateTextBox.Value))) + "'" 'и я до сих пор не получаю результатов, я тестировал его с« 2010-10-10 »в качестве даты начала и« 2016-10-10 »в качестве даты окончания – otus

Смежные вопросы