2015-02-04 2 views
0

Я работаю над оператором sql, где я пытаюсь захватить все проекты, которые меньше или равны дате разработки. Тем не менее, я получаю сообщение об ошибкеОшибка сравнения даты доступа

«несоответствие типов данных в выражении критериев»

Я искал и искал, но я не смог найти что-нибудь.

Необработанные результаты выглядят примерно так:

| Title | devTerm | pilotTerm | 
+-------+---------+-----------+ 
| Ex1 | 201401 | 201404 | 
| Ex2 | 201301 | 201401 | 
| Ex3 | 201504 | 201601 | 

Вот мой запрос:

SELECT * 
FROM projects 
WHERE Len(devTerm)>0 
AND Len(pilotTerm)>0 
AND Date() >= CDate(DateSerial(Left(devTerm,4),Right(devTerm,2),1)) 

Что я делаю неправильно?

p.s. Я бы не использовал Access, если бы мне не пришлось.

Я ссылки в этой статье: Convert Text to date

Скриншот: Screenshot

+0

Каких типов данных являются ваши столбцы? Если devTerm и pilotTerm не являются текстом, это может вызвать ошибку. – Ditto

+0

Они оба «shorttext» –

+0

@Ditto Почему они бросают ошибку, если они не являются текстом? В моем ближайшем окне я протестировал 'MsgBox CDate (DateSerial (Left (« 201401 », 4), Right (« 201401 », 2), 1))' и 'MsgBox CDate (DateSerial (Left (201401, 4), Right (201401, 2), 1)) 'оба работали. – Newd

ответ

0

Хорошо, я понял вопрос. Из комментариев по моему вопросу я смог задуматься о функции Nz(). Окончательный запрос выглядит

SELECT * 
FROM projects 
WHERE Date() >= DateSerial(Left(Nz(devTerm, "1990"),4),Right(Nz(devTerm, "01"),2), 1) 
AND Date() < DateSerial(Left(Nz(pilotTerm, "1990"),4),Right(Nz(pilotTerm, "01"),2), 1) 

pilotTerm и devTerm кидали NULLs, и вот где вопрос идет. Я думал, что Access SQL будет фильтровать их с

Len(devTerm)>0 
AND Len(pilotTerm)>0 
0

До сих пор единственным способом мне удалось воссоздать эту проблему, сделав функцию быстрого теста, чтобы увидеть, какие возможности это может быть , От этого я чувствую, что должна быть запись, которая является пустым или недействительным, то функцию воссозданы это выглядит следующим образом:

Public Function Test() 

    If Date >= DateSerial(Left("201401", 4), Right("201401", 2), 1) Then 
     MsgBox DateSerial(Left("", 4), Right("", 2), 1) 
    End If 

End Function 

Он попадает в, если заявление, а затем разрывает с типом рассогласования. Таким образом, пустая запись может привести к этой или недопустимой записи.

0

Ну это явно проблема с Left() и Right() невозвращения правильного значения из-за Null значения. Вы можете использовать это,

SELECT 
    * 
FROM 
    projects 
WHERE 
    DateSerial(Left(Nz([devTerm], 205812), 4), Right(Nz([devTerm], 205812), 2), 1) <= Date() 

новозеландские() будет учитывать тот факт, они имеют нулевые значения и создают дату путь вперед в будущем, которое всегда будет больше, чем Date()

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