Как обойти или исправить ошибку Ошибка: недопустимое использование Null? - PullRequest
1 голос
/ 24 января 2012

В этом фрагменте кода доступа MS я пытаюсь получить максимальную дату регистрации клиента. Сначала я должен преобразовать дату, чтобы она могла работать с агрегатной функцией. К сожалению, в столбце даты есть области, которые являются нулевыми.

Я получаю сообщение об ошибке Неправильное использование нуля из-за отсутствия записей в некоторых записях.

Как я могу это исправить, есть ли обходной путь?

Вот код:

SELECT CUSTOMER.FIRST_NAME, 
    MAX(DateSerial(CInt(Left([CUSTOMER.SIGNUP_DATE],4)),CInt(Mid([CUSTOMER.SIGNUP_DATE],5,2)),CInt(Right([CUSTOMER.SIGNUP_DATE],2)))) AS SIGN_DATE, 
    (DateSerial(CInt(Left([CUSTOMER.LEAVE_DATE],4)),CInt(Mid([CUSTOMER.LEAVE_DATE],5,2)),CInt(Right([CUSTOMER.LEAVE_DATE],2)))) AS LEV_DATE
FROM CUSTOMER
WHERE ((DateSerial(CInt(Left([CUSTOMER.SIGNUP_DATE],4)),CInt(Mid([CUSTOMER.SIGNUP_DATE],5,2)),CInt(Right([CUSTOMER.SIGNUP_DATE],2)))) <=Date())
    AND ((DateSerial(CInt(Left([CUSTOMER.LEAVE_DATE],4)),CInt(Mid([CUSTOMER.LEAVE_DATE],5,2)),CInt(Right([CUSTOMER.LEAVE_DATE],2)))) =#012/31/2012#)
GROUP BY
    CUSTOMER.FIRST_NAME,
    CUSTOMER.SIGNUP_DATE,
    CUSTOMER.LEAVE_DATE;

1 Ответ

1 голос
/ 24 января 2012

Ваше поле 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...