2016-07-25 183 views
-1

我正在使用SQL Server 2008.我期待只返回每個月的最後7個日曆日,我將如何去做這件事。選擇每個月的最後7天

感謝

+0

哪種語言是您使用? –

+0

sql server 2008 - 我只是想從1月16日起每個月的最後7天收到所有的付款。 – userleo87

+0

如果你可以指定*輸入是什麼*(例如只是當前日期或提供的日期)和你期待什麼*輸出*,這可能會有很大幫助 - 如果輸入只是一個日期(或當前日期),那麼使用不同輸入的幾個例子也會有很大幫助。 –

回答

0

假設領域稱爲logTime Description該條,拿到範圍內

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

你還需要檢查「logTime Description該條」(由字段名稱代替)是你也是的日期範圍選擇例如... AND(YEAR(logtime))= 2016 ..例如

+1

如果你在比較的一邊有'logtime'並且在另一邊使用它來得出比較日期,你可以簡化 - 例如,在這裏,您只需要執行一次比較,即「logtime落入的月份結束前7天」。 –

+0

是的,你可以說DAY(logtime)> = DAY(dateadd(month,month(logtime),dateadd(year,year(logtime) - 1900,0)) - 7)並且避免任何小數部分的問題 – Cato

+0

Spot on - 非常感謝。 – userleo87

0

一些具體的例子和方向將有所幫助。如果你只是想行,其中,說columnA包含內最近7天內就各自的一個月的落在日期,那麼你可以簡單地說:

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

即它會問這個問題:「給定一個日期,A,7天后的日期是不同的月份嗎?」

請注意,此查詢和其他答案中包含的查詢都無法使用此列上的索引(因爲我們將它用作計算的輸入),這是一個恥辱。

+0

對於我缺乏描述的道歉,你已經破解了我所需要的東西。 – userleo87

0

試試這個

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

試試這個:

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