如何在SQL中按WeekNO和Year计算上个星期的月份

时间:2011-03-18 13:00:24

标签: sql date

我想在SQL中计算上周的月份数。我有周数和年份。

EG。如果我通过WeekNo = 51,Year = 2008,则函数应该返回LastWeekofMonth = 52。

我想使用以下标准计算周数。

根据ISO 8601:1988在瑞典使用,一年中的第一周是新年内至少有四天的第一周。

因此,如果您的一周从星期一开始,那么任何一年的第一个星期四都在第一周内。你可以从那里添加DateAdd或DateDiff。

请帮帮我..........

提前致谢。

3 个答案:

答案 0 :(得分:2)

SELECT WEEK(LAST_DAY(STR_TO_DATE('2008-51-Mon', '%x-%v-%a')));

应该用MySQL来获取上周的月份数:

我首先转换为日期,然后我获得该月的最后一天(此处:2008-12-31),然后计算该月最后一天的星期(52)。

将它变成一个函数应该很容易。

希望这有帮助。

答案 1 :(得分:1)

如果您使用日历表,这相当简单。您需要的月份由此查询提供。

select iso_year, month_of_year
from calendar c
where iso_year = 2008 and iso_week = 51
group by iso_year, month_of_year
--
iso_year  month_of_year
2008      12

所以你可以在日历表的连接中使用该结果,就像这样。

select max(c.iso_week) as last_week_of_month
    from calendar c
    inner join 
        (select iso_year, month_of_year
         from calendar c
         where iso_year = 2008 and iso_week = 51
         group by iso_year, month_of_year) m
    on m.iso_year = c.iso_year and m.month_of_year = c.month_of_year;
--
last_week_of_month
52

这是一个example of a calendar table,但它在CHECK约束上相当薄。

答案 2 :(得分:0)

如果您使用的是 SQL Server ,则可以使用主表执行计算,而无需创建日历表。 This fellow为您提供了非常好的解释,我建议您阅读。他计算每个月的第一个和最后一个星期日的SQL可以根据您的需要进行调整:

declare @year int
set @year =2011 

select min(dates) as first_sunday,max(dates) as last_sunday from
(
select dateadd(day,number-1,DATEADD(year,@year-1900,0))
as dates from master..spt_values
where type='p' and number between 1 and
DATEDIFF(day,DATEADD(year,@year-1900,0),DATEADD(year,@year-1900+1,0))
) as t
where DATENAME(weekday,dates)='sunday'
group by DATEADD(month,datediff(month,0,dates),0)

修改:一旦您拥有了星期四的日期,就可以获得该日期的周数:

DECLARE @Dt datetime

SELECT @Dt='02-21-2008'

SELECT DATEPART( wk, @Dt)