在这段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;