0

我正在研究一个仅在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()整个语句进行强制转换,但它仍然会引发数据类型不匹配。

我已将其归结为该表达式,并且该表达式的工作方式与statement中的预期完全相同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;
4

3 回答 3

2

TEST_DATE 是什么数据类型和格式?如果我将其设为日期/时间数据类型并使数据评估为假,我会收到错误,但如果它评估为真,它会起作用。这可能就是您看到它在 Select 中工作的原因。当我将 TEST_DATE 设为双精度并在 nz 函数(19981231)中使用您的格式时,它适用于所有情况。

于 2013-02-15T19:05:40.707 回答
0

Where声明看起来不像Select声明。Access 需要一个可以测试真假的条件表达式。

快速版本将采用整个语句并对其进行测试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连接的几个不同的条件语句OR。我在解析它时遇到了麻烦,所以我不认为我会尝试这样做。

于 2013-02-15T19:01:15.230 回答
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 都是长整数

于 2013-02-15T19:32:02.263 回答