Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 如何在SQLServer2005中生成一年的周范围?_Sql Server 2005 - Fatal编程技术网

Sql server 2005 如何在SQLServer2005中生成一年的周范围?

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上的注释

如果我将2011年作为年份通过,我必须将YEAR WEEKNUMBER STARTDATE ENDDATE值插入数据表,比如weekrange

周范围从2011-03-28开始到2011-04-03,因为在我的数据库2010中,上周范围以2011-03-27结束

像这样,我必须生成52周

我想写一个存储过程,只需要一年作为参数。今年,我必须生成周范围并插入到我的表中,如上所示

我该怎么做

问候,,
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安装中。