2011-03-18 86 views
2

我想计算上周SQL中的月份数。我有周数和年份。如何计算WeekNO和SQL年的月份上一周

例如,如果我通过WeekNo = 51,Year = 2008,那么函数应该返回LastWeekofMonth = 52.

我想用下面的标准计算Week number。

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

因此,如果您的星期从星期一开始,每年的第一个星期四都是在第一个星期内。你可以从这个DateAdd或DateDiff。

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

在此先感谢。

+0

那么,你想要在这个月的最后一个星期一的星期数? – DOK 2011-03-18 13:11:16

+3

什么**数据库***?哪个**版本**?这些东西通常不是标准化SQL语言规范的一部分,但通常是特定于供应商的 – 2011-03-18 13:22:41

+0

@DOK ...我希望该月的最后一个Thursdy的周数...... – 2011-03-18 13:46:56

回答

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

我希望月份的上个星期四的周数...即。在2011年3月份。上周的数字是13(3月份的最后一个星期四是2011年3月31日)。那样我就想上个月的上个星期,我有WeekNo和Year .. – 2011-03-18 14:34:01

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约束上很细。

+0

高度赞扬了日历表的概念。想知道Y和Z之间有多少个X?写一个查询! – 2011-03-18 14:14:11

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

应该得到每月的最后一周数量与MySQL做的伎俩:

我转换到一个日期,然后我得到这个月(这里的最后一天:2008-12-31 ),然后我计算一个月的最后一天的星期(52)。

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

希望这会有所帮助。