MS Access数据类型在表达式中仅在where语句中不匹配

时间:2013-02-15 18:43:56

标签: sql ms-access

我正在处理一个只在Where语句中抛出数据类型不匹配的表达式。

Current: IIf(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99)>0,
IIf(DateAdd("yyyy",CInt(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99))
,CVDate(Format(Nz([TEST_DATE],19891231),"0000-00-00")))>Now(),True,False),True)

正如您所看到的,我已经为每个引用添加了Nz()函数,甚至尝试在整个语句上转换CBool(),但它仍然会引发数据类型不匹配。

我已将其精确定位到此表达式,表达式与Select语句中的预期完全一致。当我将其添加到Where语句中,只返回True时,会发生错误。

我能错过什么?

更新:感兴趣的人的完整查询

SELECT Student.TECH_ID, Student.CAPP_LVL, Values.ABBR, Values.SHORT_DESC, Values.LONG_DESC, Values.GROUP_NBR, Values.NBR_YRS_VALID, Student.SEQ_NBR, Student.CAPP_LVL_SCORE, Student.TEST_DATE, IIf(Nz([Values].[NBR_YRS_VALID],99)>0,IIf(DateAdd("yyyy",CInt([Values].[NBR_YRS_VALID]),CVDate(Format([TEST_DATE],"0000-00-00")))>Now(),True,False),True) AS [Current], Values.END_DATE, Student.LOAD_DATE
FROM Student INNER JOIN Values ON Student.CAPP_LVL = Values.CAPP_LVL
WHERE (((Values.ABBR)<>"MTHB") AND ((Values.END_DATE) Like "9999*"))
ORDER BY Student.TECH_ID, Student.CAPP_LVL, Student.SEQ_NBR;

3 个答案:

答案 0 :(得分:2)

什么数据类型和格式是TEST_DATE?如果我将其设置为Date / Time数据类型并将数据计算为false,则会出现错误,但如果计算结果为true,则会出错。这可能就是为什么你看到它在Select中工作的原因。当我将TEST_DATE设为double时,并在nz函数(19981231)中使用您的格式,它适用于所有情况。

答案 1 :(得分:0)

Where语句看起来不像Select语句。 Access期望一个条件表达式 it 可以测试true或false。

快速版本将采用整个声明并测试True

WHERE (IIf(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99)>0,
IIf(DateAdd("yyyy",CInt(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99))
,CVDate(Format(Nz([TEST_DATE],19891231),"0000-00-00")))>Now(),True,False),True))
= True

更好的解决方案是将其重写为由ANDOR加入的几个不同的条件语句。我在解析它时遇到了麻烦,所以我认为我不会尝试这一点。

答案 2 :(得分:0)

这对我有用:

SELECT 
    IIf(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99)>0,IIf(DateAdd("yyyy",
       CInt(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99)),
       CVDate(Format(Nz([TEST_DATE],19891231),"0000-00-00")))
         >Now(),True,False),True) 
       AS [Current],
    ISRS_VAL_ST_CAPP_LVL.NBR_YRS_VALID, 
    ISRS_VAL_ST_CAPP_LVL.TEST_DATE
FROM ISRS_VAL_ST_CAPP_LVL
WHERE (((IIf(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99)>0,IIf(DateAdd("yyyy",
    CInt(Nz([ISRS_VAL_ST_CAPP_LVL].[NBR_YRS_VALID],99)),
    CVDate(Format(Nz([TEST_DATE],19891231),"0000-00-00")))
       >Now(),True,False),True))=true));

NBR_YRS_VALID和TEST_DATE都是长整数