Проблема с sql-запросом с использованием базы данных Access

#sql #ms-access

#sql #ms-access

Вопрос:

я использую Access в качестве базы данных, и у меня проблема с приведенным ниже запросом. Я знаю, что проблема связана с полем email_date, но я не знаю, как это исправить. Проблема заключается в текстовом поле, которое я пытаюсь использовать в качестве datefield с помощью CDATE и сравнить его с фактическим datefield, которое вызывает проблему. Я получаю ошибку несоответствия данных. В поле 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)
  

Комментарии:

1. Сделайте шаг назад и примените некоторые из этих советов к просмотру ваших данных, чтобы найти значения для полей, которые не будут преобразовываться в даты.

Ответ №1:

Вы можете добавить вложенное выражение 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 имеет тип Yes / No (вместо типа text), используйте литерал False в сравнении.

 AND A.FLAG_DELETE=False
  

Ответ №2:

Последняя строка фильтрует то, что попадает в результирующий набор, но не предотвращает выполнение последней строки для этих записей. Когда 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)
  

Комментарии:

1. В этом случае я с подозрением отношусь к вашему Да / Нет. Вы пробовали исключить два других поля из запроса, чтобы убедиться, что это дата?

Ответ №3:

Измените строку: И FLAG_DELETE = ‘No’ на И FLAG_DELETE = 0