首页 > 解决方案 > 为什么此查询更改有效?

问题描述

我最终放弃了 WHERE 子句中给我带来问题的部分,但最初我通过做一些对我来说根本没有意义的事情来让这个查询工作,并希望有人能对正在发生的事情有所了解这里。整个查询和功能如下,但我不确定所有这些都是必要的

所以这个查询以前是有效的,这个 WHERE 子句仍在另一个查询中成功使用。现在在 where 子句的这一行中使用了多个函数,但是如果我只使用以 ModifiedStartDate 开头的部分,则查询可以正常工作。所以看起来问题出在 ModifiedDate 上。WHERE 子句中给我们带来问题的部分是:

and ModifiedDate(r.EXPIRATION_DATE, ModifiedStartDate(r.COMMENCEMENT_DATE, 
PaySched_MaxFreq(r.RE_CONTRACT_KEY))) > #1/1/2019#   

查询失败并出现错误“条件表达式中的数据类型不匹配”。所以只是做了一些测试,我最终将以下部分添加到 WHERE 子句中:

and r.RE_CONTRACT_KEY NOT IN (1)

然后查询工作了?!?! 我真的不明白添加这一行如何神奇地解决了数据类型不匹配错误。 没有 RE_CONTRACT_KEY = 1 所以它不是坏数据或其他东西。

我做了一些测试并将 ModifiedDate 函数放入 select 子句中,它工作正常。我还使用 DATEADD 函数向 SELECT 子句添加了另一个字段,以确保函数结果仍被视为日期,并且确实如此。查询在下方,功能在下方。

SELECT DISTINCT ....
FROM ((((((PAYMENT_LINE_ITEM AS pli 
INNER JOIN PAYMENT_SCHEDULE AS tps ON pli.PAYMENT_SCHEDULE_KEY = 
ps.PAYMENT_SCHEDULE_KEY) 
INNER JOIN RECONTRACT AS r ON pli.RE_CONTRACT_KEY = r.RE_CONTRACT_KEY) 
INNER JOIN Conversion_ProductCategory AS cpc ON cpc.Value = pli.PAYMENT_TYPE) 
INNER JOIN ManualEntry AS me ON me.LeaseID = r.RE_CONTRACT_ID) 
LEFT JOIN Mapping_CostCenter AS mcc ON mcc.CostCenter = me.CostCenter) 
INNER JOIN PIW_Exclusions AS pe ON pe.RE_CONTRACT_ID = r.RE_CONTRACT_ID) 
LEFT JOIN FacilityCode_Address_xRef AS fca ON fca.[Facility Code] = 
mcc.placecode & "-" & mcc.placecodedescription
WHERE pli.PAYMENT_TYPE  in ("rent","storage","parking")  
    and ModifiedDate(r.EXPIRATION_DATE, 
    ModifiedStartDate(r.COMMENCEMENT_DATE, 
    PaySched_MaxFreq(r.RE_CONTRACT_KEY))) > #1/1/19#
    and PE.Reason = "rent extension" 
    and r.RE_CONTRACT_KEY NOT IN (1) 'New line added that made query work

和功能:

Public Function ModifiedDate(DateToModify As Date, DateToCompare As Date) As 
Date

Select Case DateToModify
Case #2/28/2000#, #2/28/2004#, #2/28/2008#, #2/28/2012#, #2/28/2016#, 
#2/28/2020#, #2/28/2024#, #2/28/2028#, #2/28/2032#, #2/28/2036#, #2/28/2040#, 
#2/28/2044#, #2/28/2048#
    DateToModify = DateAdd("d", 1, DateToModify)
End Select

If DatePart("d", DateAdd("d", 1, DateToModify)) = DatePart("d", 
DateToCompare) Then

    ModifiedDate = DateAdd("d", 1, DateToModify)

Else
    ModifiedDate = DateToModify
End If

End Function

如果您好奇,最后的工作 WHERE 子句是:

WHERE pli.PAYMENT_TYPE  in ("rent","storage","parking") 
    and r.EXPIRATION_DATE > #1/1/19#
    and PE.Reason = "rent extension"

标签: ms-accessvba

解决方案


推荐阅读