2016-09-30 5 views
2
года

У меня есть список дат, начиная от начала 1960 до 2016 года я хочу взять месяц и день Даты и:SQL DATEPART добавив

- If Month and Day > Today then add 2016 as Yr BUT 
    - If Month and Day < Today then add 2017 as Yr 

Вот SQL у меня до сих пор:

Select DATEPART(MM, Date) as Month, 
    DATEPART(dd, Date) as DayNum 
    From DateTable 
    WHERE CategoryID = 3 
+0

вы можете показать, как ваш образец выход будет выглядеть? –

ответ

1

Что-то вроде этого:

select (case when month(date) * 100 + day(date) < month(getdate()) * 100 + day(getdate()) 
      then datefromparts(2017, month(date), day(date) 
      else datefromparts(2016, month(date), day(date) 
     end) as next_anniversary 
from datetable 
where categoryid = 3; 

Вы на самом деле не делать арифметику. Это эквивалентно:

select (case when month(date) < month(getdate()) or 
        month(date) = month(getdate()) and day(date) < day(getdate()) 
      then datefromparts(2017, month(date), day(date) 
      else datefromparts(2016, month(date), day(date) 
     end) as next_anniversary 
from datetable 
where categoryid = 3; 

Также datefromparts() доступна в SQL Server 2012+. Вы можете комбинировать аналогичную функциональность в более ранних версиях SQL Server, но это проще.

0

Это простой способ сделать это. Работы просто отлично

SELECT CASE WHEN SUBSTRING(CAST(CAST(Date AS DATE) AS NVARCHAR),6,10)<SUBSTRING(CAST(CAST(GETDATE() AS DATE) AS NVARCHAR),6,10) 
THEN datefromparts(2017, month(Date), day(Date)) 
ELSE datefromparts(2016, month(Date), day(Date)) END 
FROM datetable 
WHERE categoryid = 3; 

Сообщите мне, если это сработает для вас.

Incase ваш работают SQL Server 2008, DATEFROMPARTS не будет работать, вместо того, чтобы использовать

SELECT CASE WHEN SUBSTRING(CAST(CAST(Date AS DATE) AS NVARCHAR),6,10)<SUBSTRING(CAST(CAST(GETDATE() AS DATE) AS NVARCHAR),6,10) 
THEN DATEADD(YEAR, 2017-YEAR(ex_date), Date) 
ELSE DATEADD(YEAR, 2016-YEAR(ex_date), Date) 
END 
FROM datetable 
WHERE categoryid = 3; 
0

ниже используется запрос для версии SQL Server с 2008.

 SELECT CASE WHEN month(date) < =month(getdate()) and day(date) < day(getdate()) 
        THEN CONVERT(DATE,'2017-'+ 
           CAST(Month(date) AS VARCHAR(2))+'-'+CAST(Day(date) AS VARCHAR(2))) 
        ELSE CONVERT(DATE,'2016-'+ 
          CAST(Month(date) AS VARCHAR(2))+'-'+CAST(Day(date) AS VARCHAR(2))) END as new_date 
    FROM datetable 
    WHERE categoryid = 3;