Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 2008 SQL Server。获取两周周期的存储过程_Sql Server 2008_Stored Procedures_Date - Fatal编程技术网

Sql server 2008 SQL Server。获取两周周期的存储过程

Sql server 2008 SQL Server。获取两周周期的存储过程,sql-server-2008,stored-procedures,date,Sql Server 2008,Stored Procedures,Date,我目前正在尝试编写一个存储过程,当一个日期作为参数传入时,它可以计算每两周的周期 业务逻辑:一年中的第一个星期一是两周周期的第一天 例如,2010年: period period_start period_end 1 2010-01-04 2010-01-17 2 2010-01-18 2010-01-31 3 2010-02-01 2010-02-14 .... 26 2010-

我目前正在尝试编写一个存储过程,当一个日期作为参数传入时,它可以计算每两周的周期

业务逻辑:一年中的第一个星期一是两周周期的第一天

例如,2010年:

    period  period_start  period_end
    1       2010-01-04    2010-01-17
    2       2010-01-18    2010-01-31
    3       2010-02-01    2010-02-14
    ....
    26      2010-12-20    2011-01-02

通过今天的日期2010-12-31将返回26、2010-12-20和2011-01-02。如何实现这一点?

您可以创建一个函数来获取一年中的第一个星期一。像这样的方法应该会奏效:

CREATE FUNCTION dbo.FirstMonday(@Year VARCHAR(4))
RETURNS DATE
AS
BEGIN
DECLARE @Return DATE;

WITH Dates AS  
(
  SELECT CONVERT(DATE,@Year+'0101') AS DateVal 
  UNION ALL 
  SELECT DATEADD(d, 1, DateVal) AS DateVal 
  FROM Dates 
  WHERE DATEADD(d, 1, DateVal) < DATEADD(m, 1, @Year+'0101')
)
SELECT @Return = MIN(DateVal)
FROM Dates
WHERE DATENAME(WEEKDAY,DateVal) = 'Monday'

RETURN @Return
END

您可以创建一个函数来获取一年中的第一个星期一。像这样的方法应该会奏效:

CREATE FUNCTION dbo.FirstMonday(@Year VARCHAR(4))
RETURNS DATE
AS
BEGIN
DECLARE @Return DATE;

WITH Dates AS  
(
  SELECT CONVERT(DATE,@Year+'0101') AS DateVal 
  UNION ALL 
  SELECT DATEADD(d, 1, DateVal) AS DateVal 
  FROM Dates 
  WHERE DATEADD(d, 1, DateVal) < DATEADD(m, 1, @Year+'0101')
)
SELECT @Return = MIN(DateVal)
FROM Dates
WHERE DATENAME(WEEKDAY,DateVal) = 'Monday'

RETURN @Return
END

@拉马克做了最难的部分,计算出了今年的第一个星期一。我稍微修改了一下他的程序,以采用datetime值,如下所示:

--  Return first Monday for the year being passed in
CREATE FUNCTION dbo.FirstMonday (@TargetDay datetime)
RETURNS DATE
AS
BEGIN
DECLARE @Return DATE

--  Set to first of its year
SET @TargetDay = dateadd(dd, -datepart(dayofyear, @TargetDay) + 1, @TargetDay)

;WITH Dates AS
(
  SELECT @TargetDay AS DateVal
  UNION ALL
  SELECT DATEADD(d, 1, DateVal) AS DateVal
  FROM Dates
  WHERE DATEADD(d, 1, DateVal) < DATEADD(m, 1, @TargetDay)
)
SELECT @Return = MIN(DateVal)
FROM Dates
WHERE DATENAME(WEEKDAY,DateVal) = 'Monday'

RETURN @Return
END 
GO

--  Test it
print dbo.FirstMonday(getdate())
print dbo.FirstMonday('Jan 1, 2010')
如果选择一年中第一个星期一之前的某一天,则此操作将失败,因为它将返回该日期之后的第一个双周周期。还是失败了?您没有指定此类日期的正确期限…:


然而,正如@HLGEM所说,根据你正在做的事情,你可能最好建立并使用某种形式的双周周期查找表,特别是如果你需要正确处理这些早期日期的话。

@Lamak做了困难的部分,计算出了一年中的第一个星期一。我稍微修改了一下他的程序,以采用datetime值,如下所示:

--  Return first Monday for the year being passed in
CREATE FUNCTION dbo.FirstMonday (@TargetDay datetime)
RETURNS DATE
AS
BEGIN
DECLARE @Return DATE

--  Set to first of its year
SET @TargetDay = dateadd(dd, -datepart(dayofyear, @TargetDay) + 1, @TargetDay)

;WITH Dates AS
(
  SELECT @TargetDay AS DateVal
  UNION ALL
  SELECT DATEADD(d, 1, DateVal) AS DateVal
  FROM Dates
  WHERE DATEADD(d, 1, DateVal) < DATEADD(m, 1, @TargetDay)
)
SELECT @Return = MIN(DateVal)
FROM Dates
WHERE DATENAME(WEEKDAY,DateVal) = 'Monday'

RETURN @Return
END 
GO

--  Test it
print dbo.FirstMonday(getdate())
print dbo.FirstMonday('Jan 1, 2010')
如果选择一年中第一个星期一之前的某一天,则此操作将失败,因为它将返回该日期之后的第一个双周周期。还是失败了?您没有指定此类日期的正确期限…:


然而,正如@HLGEM所说,根据您正在做的事情,您可能最好构建并使用某种形式的双周周期查找表,特别是如果您需要正确处理这些早期日期。

您使用的是什么版本的SQL Server?53周的时间呢?i、 当你到达下一年的第一个星期一时,你已经过了两周的一半了。我希望你写这篇文章是为了创建一个周期表来使用剩余的时间。如果是这样的话,我建议它有一年,也有一段时间是主键。然后,您可以安排在12月初或您开始需要下一年数据的任何时候填充下一年的数据。然后,所有其他查询都可以依赖于句点表,而不必每次都进行混乱的计算。我尝试使用句点表,但闰年会变得混乱。您使用的是什么版本的SQL Server?53周年的情况如何?i、 当你到达下一年的第一个星期一时,你已经过了两周的一半了。我希望你写这篇文章是为了创建一个周期表来使用剩余的时间。如果是这样的话,我建议它有一年,也有一段时间是主键。然后,您可以安排在12月初或您开始需要下一年数据的任何时候填充下一年的数据。然后,所有其他查询都可以依赖于周期表,而不必每次都进行混乱的计算。我尝试使用周期表,但闰年会变得混乱。哦,我没有注意到op改变了他的问题+1到你的解决方案,效果如预期。哦,我没有注意到op改变了他的问题+1到您的解决方案,按预期工作。