SQL Server 2008 R2:将过去的日期更新为“下一个”日期

Posted

技术标签:

【中文标题】SQL Server 2008 R2:将过去的日期更新为“下一个”日期【英文标题】:SQL Server 2008 R2: Updating past dates to the 'next' date 【发布时间】:2014-02-09 21:19:42 【问题描述】:

我使用的是 SQL Server 2008 R2。我有一张桌子,上面有很多日期,有些是过去的,有些是未来的。我想做的是更新它们,以便日期是相对于今天的“下一个”日期。

例如假设当前日期是'2014-02-09'

Current Value     Desired Value
-------------------------------------------------    
'2010-01-06'      '2015-01-06' (Updated to 2015)
'2008-03-28'      '2014-03-28' (Updated to 2014)

我需要说明 2 月 29 日的日期,以便更轻松!

最好的方法是什么?

【问题讨论】:

计算从今天到 x 的年数,然后将该年数与 x 相加。 @dnoeth:这没有考虑到结果日期可能早于“当前日期”,在这种情况下必须考虑下一年(查看第一行)。跨度> @Tim Schmelter:是的,这是年数(即年龄)加一 :-) @dnoeth:如果他需要添加 0 年或 1 年,则取决于结果日期。 @Tim Schmelter:如果你计算完整的年数(也就是年龄),这就像是下一个生日。我发布了一个答案来展示它。 【参考方案1】:

您可以确定过去多少年的日期。然后将该年数加一添加到日期:

update t
    set datecol = dateadd(year,
                          datediff(year, datecol, getdate()) + 1,
                          datecol)
    where datecol < getdate();

【讨论】:

【参考方案2】:

这应该可行:

Declare @CurrentDate datetime
SET @CurrentDate = '2014-02-09'

;WITH NewDatesThisYear AS
(
    SELECT [Date], 
           NewDate = DateAdd(yy, YEAR(@CurrentDate)-1900,  
                     DateAdd(m,  MONTH([Date]) - 1, DAY([Date]) - 1)) 
    FROM dbo.Dates
)
, NewDates AS
(
    SELECT [Date], 
           NewDate = CASE WHEN NewDate < @CurrentDate 
                     THEN DateAdd(yy, 1,NewDate) 
                     ELSE NewDate END
    FROM NewDatesThisYear
)
UPDATE NewDates SET [Date] = NewDate
WHERE [Date] < @CurrentDate

Demo

【讨论】:

【参考方案3】:

未经测试:

CASE WHEN dateadd(yy, datecol, datediff(yy, datecol, getdate())) > getdate()
     THEN dateadd(yy, datecol, datediff(yy, datecol, getdate()))
     ELSE dateadd(yy, datecol, datediff(yy, datecol, getdate())+1)
END

如果 SQL Server 支持简单的年龄计算,这会容易得多:-)

dateadd(yy, datecol, age(datecol, getdate()) +1)

【讨论】:

以上是关于SQL Server 2008 R2:将过去的日期更新为“下一个”日期的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sql server 2008 r2 将日期显示为 mm/dd/yyyy hh:mm Am/PM?

SQL Server 2008 R2 – 将多行减少为一行

SQL Server 2008 R2:使用多个 CTE 获取日期明智的记录

获取每个月的第一个日期 SQL Server 2008 R2

如何在 sql server 2008R2/ssis 中为每个日期导出带有日期时间的单独 excel 表?

sql server 2008 r2执行维护计划时出现错误