如何解决或补救错误:无效使用Null



在这段MS访问代码中,我试图获取客户注册的最大日期。首先,我必须转换日期,这样它才能使用聚合函数。不幸的是,日期列中有一些区域为空。

我收到错误由于某些记录缺少日期,无效使用null

我该怎么补救,有什么办法吗?

这是代码:

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;

SIGNUP_DATE字段以字符串形式包含日期,格式为:"20120131"。因此,您使用Left()、Mid()和Right()函数来拆分年、月和日的子字符串,并使用CInt()将它们转换为数字,最后将这些数字输入DateSerial()。

如果只有您的日期字符串在这三个部分之间包含合适的分隔符,您可以简单地将字符串输入到CDate(),例如CDate("2012-01-31")。因此,我建议您在查询中为字符串添加分隔符,并将其提供给CDate()。

这是我的简化客户表:

id SIGNUP_DATE
1  20120130
2 
3  20120131

此查询将非Null的SIGUP_DATE值转换为日期/时间值,并丢弃SIGUP_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;

那么获取最大值就很简单了。

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;

最新更新