我正在处理一个只在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;
答案 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
更好的解决方案是将其重写为由AND
或OR
加入的几个不同的条件语句。我在解析它时遇到了麻烦,所以我认为我不会尝试这一点。
答案 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都是长整数