2013-06-13 6 views
1

J'ai déjà eu que ce genre d'enregistrements dans ma "période" -column: CW 01, CW 02, ..., CW 21TSQL - Calcul de la plage de dates avec des enregistrements différents dans la colonne

Pour récupérer seulement un certain nombre de semaines de calendrier j'utilisé cette déclaration:

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

maintenant, je dois ajouter des disques comme MO 05, MO 06 pour les valeurs mensuelles. Évidemment, j'ai besoin des valeurs CW et MO maintenant. Donc, au lieu de Datepart (semaine, ...), j'ai pensé que je pourrais utiliser "month" mais je n'ai pas trouvé de moyen de modifier la sous-chaîne stmt, afin de récupérer les 6 dernières semaines ou 2 mois à partir de maintenant.

Avez-vous une idée pour résoudre ce problème? Tout ce que je veux est: « Montrez-moi les dossiers pour les 2 derniers mois, mais aussi les entrées CW dans ce 2 mois à partir de maintenant aller J'utilise MSSQL 2012.

MISE À JOUR:.fiddle

Remerciez . vous

Répondre

2

Essayez ceci:

SQL Fiddle

Recherche:

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 

Results:

| 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 | 

Mise à jour:

Essayez ceci:

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); 

OU cette

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)); 
+0

Je ne sais pas si c'est ce dont j'ai besoin. Voir mon violon ajouté ci-dessus pour la structure. Dans ce violon, je veux filtrer le "CW 08" -row. – SvenB

+0

@SvenB: Le filtrage de "CW 08" est la clause simple where. Pouvez-vous ajouter l'exemple d'entrée et de sortie. Je serai en mesure d'aider. –

+0

c'est juste un exemple. Je sais que je peux le faire manuellement. Par exemple, seulement obtenir les deux derniers mois à partir de maintenant devrait travailler à l'intérieur d'un STMT. – SvenB

Questions connexes