2014-02-09 2 views
1

Я использую SQL Server 2008 R2. У меня есть таблица с множеством дат, некоторые в прошлом, некоторые в будущем. То, что я хотел бы сделать, это обновить их, чтобы даты были «следующей» датой по сравнению с сегодняшним днем.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) 

я бы необходимо учитывать даты на 29 февраля, как раз, чтобы сделать это проще!

Каков наилучший способ для этого?

+0

Рассчитайте количество лет между сегодняшним днем ​​и x, а затем добавьте это количество лет в x. – dnoeth

+0

@dnoeth: это не учитывает, что итоговая дата может быть раньше, чем «текущая дата», и в этом случае следующий год должен быть взят (посмотрите на первую строку). –

+0

@Tim Schmelter: Да, это количество лет (то есть возраст) плюс один :-) – dnoeth

ответ

1

Вы можете определить, кто много лет назад. Затем добавить, что число лет плюс один к дате:

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

Это должно работать:

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

0

непроверенных:

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 поддерживает простой возрастный калькулятор n :-)

dateadd(yy, datecol, age(datecol, getdate()) +1) 
Смежные вопросы