Проблема с SQL-запросом с использованием базы данных Access - PullRequest
0 голосов
/ 10 октября 2011

Я использую Access в качестве базы данных и у меня возникла проблема с запросом ниже.Я знаю, что проблема с полем email_date, но я не знаю, как это исправить.Проблема в текстовом поле, которое я пытаюсь использовать как поле даты, используя CDATE, и сравнивать его с фактическим полем даты, которое вызывает проблему.Я получаю ошибку несоответствия данных.В поле email_date, если ничего нет, поле состоит из '-', в противном случае оно имеет 21.09.2011.Любая помощь будет очень ценится.

 SELECT A.ICAO, A.IATA, A.AIRPORT_NAME, A.CITY, A.COUNTRY, 
 A.REVISED_DATE, A.COMPANY, A.EMAIL_DATE 
 FROM AIRPORT_CHECKLIST A  
 WHERE A.COMPANY = 'company' 
 AND FLAG_DELETE = 'No' 
 AND EMAIL_DATE <> '--'
 AND CDATE(REVISED_DATE) > CDATE(EMAIL_DATE)

Ответы [ 3 ]

0 голосов
/ 10 октября 2011

Вы можете добавить вложенное выражение IIf () в предложении WHERE: вернуть False, если EMAIL_DATE равен "-"; в противном случае возвращает True или False в зависимости от сравнения CDate () двух полей. Строка будет включена в результирующий набор, только если это выражение вернет True.

SELECT
    A.ICAO,
    A.IATA,
    A.AIRPORT_NAME,
    A.CITY,
    A.REVISED_DATE,
    A.COMPANY,
    A.EMAIL_DATE
FROM
    AIRPORT_CHECKLIST AS A
WHERE
        A.COMPANY='company'
    AND IIf(EMAIL_DATE='--',False,
            IIf(CDATE(REVISED_DATE) > CDATE(EMAIL_DATE),True,False))
    AND A.FLAG_DELETE='No';

Кроме того, если оба поля «дата» были текстового типа, вы можете сохранить значения даты в формате «гггг-мм-дд» и просто сравнить текстовые значения без проблем с несоответствием типов данных.

A.EMAIL_DATE <> '--' AND A.REVISED_DATE > A.EMAIL_DATE

Редактировать: Если FLAG_DELETE имеет тип Да / Нет (вместо типа текста), используйте в сравнении буквальное значение False.

AND A.FLAG_DELETE=False
0 голосов
/ 10 октября 2011

Измените строку: AND FLAG_DELETE = 'Нет' на AND FLAG_DELETE = 0

0 голосов
/ 10 октября 2011

Последняя строка фильтрует то, что заканчивается в наборе результатов, но не препятствует запуску последней строки для этих записей. Когда EMAIL_DATE = '-' последняя строка вызывает несоответствие типов.

Один из способов предотвратить это - использовать подзапрос, чтобы сначала отфильтровать пустые даты:

SELECT * FROM 
(SELECT A.ICAO, A.IATA, A.AIRPORT_NAME, A.CITY, A.COUNTRY, 
 A.REVISED_DATE, A.COMPANY, A.EMAIL_DATE 
 FROM SELECTAIRPORT_CHECKLIST A  
 WHERE A.COMPANY = 'company' 
 AND FLAG_DELETE = 'No' 
 AND EMAIL_DATE <> '--')
WHERE CDATE(REVISED_DATE) > CDATE(EMAIL_DATE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...