我正在使用Access作为数据库,并且我在下面的查询中遇到问题。我知道问题出在email_date字段,但我不知道如何解决它。问题是一个文本字段,我试图通过使用CDATE将其用作日期字段,并将其与导致问题的实际日期字段进行比较。我得到数据不匹配错误。在email_date字段中,如果没有,则该字段由“ - ”组成,否则为9/21/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)
答案 0 :(得分:0)
最后一行过滤结果集中的内容,但不会阻止最后一行在这些记录上运行。当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 :(得分:0)
您可以在WHERE子句中添加嵌套的IIf()表达式:如果EMAIL_DATE是“ - ”,则返回False;否则返回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';
此外,如果两个“日期”字段都是文本类型,则可以将日期值存储为“yyyy-mm-dd”格式,并简单地比较文本值,不会出现数据类型不匹配问题。
A.EMAIL_DATE <> '--' AND A.REVISED_DATE > A.EMAIL_DATE
编辑:如果FLAG_DELETE为是/否类型(而不是文本类型),请在比较中使用文字False。
AND A.FLAG_DELETE=False
答案 2 :(得分:0)
更改行: AND FLAG_DELETE ='不' 至 AND FLAG_DELETE = 0