Ваше поле SIGNUP_DATE содержит даты в виде строк в следующем формате: «20120131». Таким образом, вы используете функции Left (), Mid () и Right () для разделения подстрок года, месяца и дня, преобразования их в числа с помощью CInt () и, наконец, подачи этих чисел в DateSerial ().
Если бы только ваша строка даты содержала подходящие разделители между 3 частями, вы могли бы просто передать строку в CDate (), например, CDate ("2012-01-31"). Поэтому я предлагаю вам добавить разделители к строке в запросе и передать их в CDate ().
Вот моя упрощенная таблица CUSTOMERS:
id SIGNUP_DATE
1 20120130
2
3 20120131
Этот запрос преобразует ненулевые значения SIGNUP_DATE в значения даты / времени и отбрасывает строки, где SIGNUP_DATE равен Null (строка с id = 2 исключена).
SELECT
id,
CDate(Left(SIGNUP_DATE,4) & "-"
& Mid(SIGNUP_DATE,5,2) & "-" &
Right(SIGNUP_DATE,2))
AS SIGN_DATE
FROM CUSTOMER
WHERE SIGNUP_DATE Is Not Null;
Тогда получить значение Max просто.
SELECT Max(q.SIGN_DATE) AS MaxOfSIGN_DATE
FROM (
SELECT
id,
CDate(Left(SIGNUP_DATE,4) & "-"
& Mid(SIGNUP_DATE,5,2) & "-" &
Right(SIGNUP_DATE,2))
AS SIGN_DATE
FROM CUSTOMER
WHERE SIGNUP_DATE Is Not Null
) AS q;
Редактировать : Если у вас нет образцов данных для тестирования, я просто добавлю его и предложу попробовать этот запрос:
SELECT
q.FIRST_NAME,
#2012/12/31# AS LEV_DATE,
Max(q.SIGN_DATE) AS MaxOfSIGN_DATE
FROM (
SELECT
FIRST_NAME,
CDate(Left(SIGNUP_DATE,4) & "-"
& Mid(SIGNUP_DATE,5,2) & "-" &
Right(SIGNUP_DATE,2))
AS SIGN_DATE
FROM CUSTOMER
WHERE
SIGNUP_DATE Is Not Null
AND LEAVE_DATE = "20121231"
) AS q
GROUP BY
1,
2;