在需要排除某个月/日组合的日期时进行匹配
我被指派写一个查询:一列中的月日组合需要与另一列的日期不相等。
也就是MED_EFF_DATE = 06/01/XXXX,MED_CANC_DT不等于08/29/XXXX。
我尝试使用DATEPART来检查月份和日,但它排除的范围比应该的还多。例如,它会排除6/29/XXXX。
WHEN ((DATEPART(mm, MED_EFF_DATE) = 6 AND DATEPART(dd, MED_EFF_DATE) = 1))
AND ((DATEPART(mm, MED_CANC_DATE) <> 8 AND DATEPART(dd, MED_CANC_DATE) <> 29))
解决方案
((DATEPART(mm, MED_CANC_DATE) <> 8 AND DATEPART(dd, MED_CANC_DATE) <> 29)) 将排除所有日期,其中日期是29日,或者月份是8 月。
更可能你想对后者使用一个 NOT 来处理:
WHERE DATEPART(mm, MED_EFF_DATE) = 6 AND DATEPART(dd, MED_EFF_DATE) = 1
AND NOT(DATEPART(mm, MED_CANC_DATE) = 8 AND DATEPART(dd, MED_CANC_DATE) = 29)
另外,或许把 JOINing到日历表上会更好,这样就能得到一个更具SARGable的查询。伪SQL如下:
SELECT ...
FROM ...
JOIN dbo.Calendar CED ON YT.MED_EFF_DATE = CED.CalendarDate
JOIN dbo.Calendar CCD ON YT.MED_CANC_DATE = CCD.CalendarDate
WHERE CED.CalendarDay = 1
AND CED.CalendarMonth = 6
AND NOT (CCD.CalendarDay = 29 AND CCD.CalendarMonth = 8)
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。