我试图弄清楚如何在 where 子句中使用声明的变量来帮助设置某些过滤器。
这个想法是根据指定的事件日期在某些日期之间提取数据,但我想从结果中过滤掉以前的事件日期。
因此,例如,如果我有 4 个事件日期,并且我想提取该事件日期之前的一周数据(不包括以前的事件日期),我将有这样的代码(注意 where 子句不正确,但这就是想法我正在寻找的东西):
前任:
/*
Event Dates:
2021-07-20
2021-08-02
2021-08-04
2021-08-05
*/
DECLARE @event_date DATE = '2021-08-04', @start_date DATE, @end_date DATE
if @event_date = '2021-07-20' BEGIN SET @start_date = '2021-07-15' SET @end_date = '2021-07-20' END
else if @event_date = '2021-08-02' BEGIN SET @start_date = '2021-07-28' SET @end_date = '2021-08-02' END
else if @event_date = '2021-08-04' BEGIN SET @start_date = '2021-07-30' SET @end_date = '2021-08-04' END
else if @event_date = '2021-08-05' BEGIN SET @start_date = '2021-07-31' SET @end_date = '2021-08-05' END
SELECT acct_num, dt, var1, var2, var3, var4, var5 /*dt column is the date*/
FROM TEST_DB
WHERE dt BETWEEN @start_date AND @end_date
AND (CASE -- This is basically what I'm trying to accomplish, not sure how though
WHEN @event_date = '2021-08-04' THEN dt!= '2021-08-02'
WHEN @event_date = '2021-08-05' THEN dt not in ('2021-08-02', '2021-08-04')
END as whatever)
AND acct_num = 1234
因此,理想情况下,当提取与先前事件日期重叠的日期范围时 - 这些事件日期会从结果中排除。我在 SO 上找到了许多其他帖子,但似乎没有什么能真正回答这个具体问题。
帮助表示赞赏!
编辑澄清:这就是数据库的样子。Var 列只是虚拟数据。
| acct_num | dt | 变量1 | 变量2 | 变量3 | var4 | 变量5 |
|---|---|---|---|---|---|---|
| 1234 | 2021-07-29 | 1 | 7 | 1 | 3 | 8 |
| 1234 | 2021-07-30 | 7 | 3 | 8 | 6 | 0 |
| 1234 | 2021-07-31 | 6 | 4 | 7 | 2 | 1 |
| 1234 | 2021-08-01 | 4 | 2 | 5 | 2 | 1 |
| 1234 | 2021-08-02 | 6 | 5 | 2 | 4 | 1 |
| 1234 | 2021-08-03 | 1 | 7 | 1 | 3 | 8 |
| 1234 | 2021-08-04 | 7 | 3 | 8 | 6 | 0 |
| 1234 | 2021-08-05 | 6 | 4 | 7 | 2 | 1 |
| 1234 | 2021-08-06 | 2 | 6 | 4 | 6 | 4 |
因此,理想情况下,根据我声明的 event_date 变量,我希望以以下方式返回结果:EX,如果我将事件日期声明为“2021-08-04”,我将查找带有dt '2021-07-30' 到 '2021-08-04'不包括dt = '2021-08-02' 的行。
如果 event_date 设置为“2021-08-05”,则同样适用,我希望 dt 在“2021-07-31”和“2021-08-31”之间的行,不包括dt = '2021-08' 的行-02' 和 2021-08-04'。
让我知道这是否有帮助或是否需要更多说明。
谢谢!