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:使用多个 CTE 获取日期明智的记录
获取每个月的第一个日期 SQL Server 2008 R2