我想今天展示所有的propID。
我有DateLive&对于PC表上的每个propID,DateRemoved但有些具有NULL DateRemoved(因为它们仍然存在)。
我需要在我的WHEREe中使用IF(CASE)语句来执行此操作。
像...一样的东西。
今天它在哪里, AND(如果他们没有DateRemoved)那么datelive< CalendarDate 或者,如果他们确实删除了日期,则CalendarDate在DateLive和DateRemoved之间)
SELECT C.CalendarDate, PC.propID FROM Calendar C CROSS join PropertyCounts PC Where C.CalendarDate = getdate() AND (CASE WHEN PC.DateRemoved <>NULL THEN C.CalendarDate BETWEEN PC.DateLive AND PC.Dateremoved WHEN PC.DateRemoved = NULL THEN PC.DateLive < C.CalendarDate )
答案 0 :(得分:1)
where C.CalendarDate = getdate()
AND ((PC.DateRemoved is not null AND C.CalendarDate between PC.DateLive AND PC.Dateremoved)
OR
(PC.DateRemoved is null AND PC.DateLive < C.CalendarDate)
)
您已经使用Where子句处于各种IF语句中。您只需构建一个布尔逻辑,当选择特定记录时,该逻辑的计算结果为TRUE。
答案 1 :(得分:0)
尝试在where子句中插入这个替换括号中的case:
...和((pc.dateremoved IS NOT NULL和pc.datelive和pc.dateremoved之间的c.calendarDate)或(pc.dateremoved IS NULL和pc.datelive&lt; c.calendardate))
答案 2 :(得分:0)
您不需要CASE
表达式(或IF
语句)的复杂性,只需要AND
和OR
的布尔逻辑
Where C.CalendarDate = getdate()
AND
(
(PC.DateRemoved IS NOT NULL AND
C.CalendarDate BETWEEN PC.DateLive AND PC.Dateremoved)
OR
(PC.DateRemoved IS NULL AND PC.DateLive < C.CalendarDate)
)
您可能还需要进行一些调整以从getdate()
中移除时间组件,例如你的第一个条件可能需要是:
Where C.CalendarDate = CONVERT(date,getdate())
因为getdate()
返回datetime
并填充了两个部分,而不仅仅是没有时间组件的普通日期。