Sql server 2005 如何在SQLServer2005中生成一年的周范围?
如果我将2011年作为年份通过,我必须将YEAR WEEKNUMBER STARTDATE ENDDATE值插入数据表,比如weekrange 周范围从2011-03-28开始到2011-04-03,因为在我的数据库2010中,上周范围以2011-03-27结束 像这样,我必须生成52周 我想写一个存储过程,只需要一年作为参数。今年,我必须生成周范围并插入到我的表中,如上所示 我该怎么做 问候,,Sql server 2005 如何在SQLServer2005中生成一年的周范围?,sql-server-2005,Sql Server 2005,如果我将2011年作为年份通过,我必须将YEAR WEEKNUMBER STARTDATE ENDDATE值插入数据表,比如weekrange 周范围从2011-03-28开始到2011-04-03,因为在我的数据库2010中,上周范围以2011-03-27结束 像这样,我必须生成52周 我想写一个存储过程,只需要一年作为参数。今年,我必须生成周范围并插入到我的表中,如上所示 我该怎么做 问候,, jn以下内容将根据SQL server的周数定义生成所需的数据,请参见DATEPARTww上的注释
jn以下内容将根据SQL server的周数定义生成所需的数据,请参见DATEPARTww上的注释。请注意,这意味着有些年份有53周
DECLARE @year AS CHAR(4)
SET @year = '2011'
DECLARE @firstDay DATETIME
SET @firstDay = CAST(@year + '0101' AS DATETIME)
;WITH dayCTE
AS
(
SELECT DATEADD(dd,ROW_NUMBER() OVER (ORDER BY name) - 1, @firstDay) AS yearday
FROM master.dbo.spt_values
)
,weekCTE
AS
(
SELECT yearday,
DATEPART(WW,yearday) AS weekno
FROM dayCTE
WHERE YEAR(yearday) = @year
)
SELECT @year AS [YEAR],
weekno AS WEEKNUMBER,
MIN(yearday) AS STARTDATE,
MAX(yearday) AS ENDDATE
FROM weekCTE
GROUP BY weekno
ORDER BY weekno
这是一个附带的观点,但我建议将目标表的年份列重命名为非t-SQL关键字的列。鉴于50年的周范围将只占用2600行,为什么不生成数据库可能需要的所有行?定义周数的规则是什么?如果您在某些年份中可能没有53周,您将需要定义有关如何识别第1周的第1天的规则。在dayCTE中,我不明白为什么您要为master.dbo.spt_值中的每一行获取行号。该表有2346行,与任何日期范围都不相关。在我看来,spt_值似乎包含各种内部系统类型的值范围。同样,与查找两个日期之间的天数无关。@EdwardJ.Stembler-您将看到,如果您自己在dayCTE内部执行代码,master.dbo.spt_值将用作数字或计数表,以生成一系列序列数字。spt_值通常用于此目的,尤其是在论坛上,因为它存在于所有SQL server安装中。