2016-07-25 5 views
-1

J'utilise SQL Server 2008. Je cherche à ramener seulement les 7 derniers jours de calendrier de chaque mois, comment pourrais-je faire cela.Sélectionnez les 7 derniers jours de chaque mois

Merci

+0

Quelle langue utilisez-vous? –

+0

SQL Server 2008 - Je veux juste apporter tous les paiements reçus des 7 derniers jours de chaque mois depuis Janvier 16 – userleo87

+0

Si vous pouvez spécifier * ce que l'entrée est * (Est-ce par exemple juste la date actuelle, ou une date fournie) et Ce que vous attendez en tant que * sortie *, cela aiderait probablement beaucoup - si l'entrée est juste une date unique (ou la date actuelle), quelques exemples qui utilisent des entrées différentes aideraient beaucoup aussi. –

Répondre

0

supposant champ appelé logtime, obtenir la gamme avec

....where logtime BETWEEN dateadd(month,month(logtime),dateadd(year, year(logtime) - 1900,0)) - 7 
            AND 
            dateadd(month,month(logtime),dateadd(year, year(logtime) - 1900,0)) - 1; 

vous devez également vérifier que « logtime » (remplacé par votre nom de domaine) est dans la plage de dates que vous êtes aussi sélectionnant par exemple ... ET (ANNÉE (logtime)) = 2016 .. par exemple

+1

Si vous avez 'logtime' d'un côté d'une comparaison et que vous l'utilisez de l'autre côté pour dériver les dates de comparaison, vous pouvez simplifier - par ex. Ici vous n'avez besoin de faire qu'une seule comparaison avec "le jour 7 jours avant la fin du mois dans lequel' logtime' tombe ". –

+0

oui vous pourriez dire DAY (logtime)> = DAY (dateadd (mois, mois (logtime), dateadd (année, année (logtime) - 1900,0)) - 7) et également éviter des fractions de jours problèmes – Cato

+0

- Merci beaucoup. – userleo87

0

Certains exemples spécifiques et la direction aideraient. Si vous voulez juste les lignes où, dites-columnA contient une date qui tombe dans les 7 derniers jours de ce mois de respectif, alors vous pouvez dire simplement:

WHERE month(columnA) != month(dateadd(day,7,columnA)) 

à savoir il pose la question, "donné une date, A, la date 7 jours plus tard tomber dans un mois différent?"

Notez que ni cette requête ni ceux inclus dans les autres réponses ne peuvent utiliser des index sur cette colonne (puisque nous l'utilisons comme une entrée pour un calcul), ce qui est dommage.

+0

Excuses pour mon manque de description, vous avez cependant craqué exactement ce dont j'avais besoin. – userleo87

0

Essayez cette

SELECT 
    * 
FROM 
    Payments P 
WHERE 
    P.PaymentDay < (SELECT DATEADD(month, ((YEAR(P.PaymentDay) - 1900) * 12) + MONTH(P.PaymentDay), -1)) AND -- Last day of current year-month 
    P.PaymentDay > (SELECT DATEADD(month, ((YEAR(P.PaymentDay) - 1900) * 12) + MONTH(P.PaymentDay), -7)) -- Last 7. day of current year-month 
0

Essayez ceci:

--DAY(DATE) as day_of_month from day_master table. 
select 
a.day_id,a.day_of_month 
from day_master a LEFT JOIN (select max(day_of_month) as 'max_day_of_month',day_id,month_no,year_no from day_master group by month_no,year_no)b ON b.month_no=a.month_no and a.year_no=b.year_no 
where (b.max_day_of_month-a.day_of_month)<7 and a.month_no=11 and a.year_no=2017 
GROUP BY a.month_no,a.year_no,a.day_id;