2016-07-25 144 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;