1

我以前的“时期”列中只有这些记录:CW 01、CW 02、...、CW 21

为了仅检索特定范围的日历周,我使用了以下语句:

Select Period,....,
where    
(CONVERT(tinyint, SUBSTRING(Period, 4, 2)) >= DATEPART(week, GETDATE()) - 5), ...

现在我必须为每月值添加MO 05、MO 06等记录。显然我现在需要 CW 和 MO 值。

因此,我认为可以使用“月”而不是 Datepart(week,...),但我找不到修改子字符串 stmt 的方法,以便从现在起检索过去 6 周或 2 个月。

你知道如何解决这个问题吗?我想要的是:“显示过去 2 个月的记录,以及从现在起 2 个月内的 CW 条目。我使用的是 MSSQL 2012。

更新: 小提琴

谢谢你。

4

1 回答 1

2

尝试这个 :

SQL小提琴

查询

with demo_cte as
( select DATEPART(wk,getdate()) CW,DATEPART(MM,getdate()) MO
   , GETDATE() cur_date, DATEADD(MM,-2,getdate()) end_date
    union all
  select DATEPART(wk,cur_date-7) CW,DATEPART(MM,cur_date-7) MO
   , cur_date -7 cur_date, end_date
from demo_cte
where cur_date>end_date
)   
select * from demo_cte

结果

| CW | MO |                     CUR_DATE |                     END_DATE |
-------------------------------------------------------------------------
| 24 |  6 |  June, 13 2013 12:18:43+0000 | April, 13 2013 12:18:43+0000 |
| 23 |  6 |  June, 06 2013 12:18:43+0000 | April, 13 2013 12:18:43+0000 |
| 22 |  5 |   May, 30 2013 12:18:43+0000 | April, 13 2013 12:18:43+0000 |
| 21 |  5 |   May, 23 2013 12:18:43+0000 | April, 13 2013 12:18:43+0000 |
| 20 |  5 |   May, 16 2013 12:18:43+0000 | April, 13 2013 12:18:43+0000 |
| 19 |  5 |   May, 09 2013 12:18:43+0000 | April, 13 2013 12:18:43+0000 |
| 18 |  5 |   May, 02 2013 12:18:43+0000 | April, 13 2013 12:18:43+0000 |
| 17 |  4 | April, 25 2013 12:18:43+0000 | April, 13 2013 12:18:43+0000 |
| 16 |  4 | April, 18 2013 12:18:43+0000 | April, 13 2013 12:18:43+0000 |
| 15 |  4 | April, 11 2013 12:18:43+0000 | April, 13 2013 12:18:43+0000 |

更新 :

尝试这个 :

Select * from test
where    period like 'CW%' and 
(CONVERT(tinyint, SUBSTRING(Period, 4, 2)) >= DATEPART(week, GETDATE()) - 5)
UNION 
Select * from test
where    period like 'MO%' and 
(CONVERT(tinyint, SUBSTRING(Period, 4, 2)) >= DATEPART(MM, GETDATE()) - 2);

或这个

Select * from test
where    (period like 'CW%' and 
(CONVERT(tinyint, SUBSTRING(Period, 4, 2)) >= DATEPART(week, GETDATE()) - 5))
or
(period like 'MO%' and 
(CONVERT(tinyint, SUBSTRING(Period, 4, 2)) >= DATEPART(MM, GETDATE()) - 2));
于 2013-06-13T12:14:30.333 回答