Sql server 2008 SQL Server。获取两周周期的存储过程
我目前正在尝试编写一个存储过程,当一个日期作为参数传入时,它可以计算每两周的周期 业务逻辑:一年中的第一个星期一是两周周期的第一天 例如,2010年: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-
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到您的解决方案,按预期工作。