Определить дату в этом году на основе будущей даты - PullRequest
0 голосов
/ 23 января 2020

Только что появился какой-то странный бизнес-запрос. У нас есть контракты на несколько лет. Система поддерживает дату окончания контракта. Я должен определить ту же календарную дату конечной даты, но для текущего года, если он не прошел в этом году, или в следующем году, если он прошел в этом году.

Например, по состоянию на сегодня, 2020 -01-23:

Случай 1:

Ввод: Дата окончания контракта 2022-07-01

Ожидаемый результат: 2020-07-01 (потому что 2020-07-01 еще не прошел)

Случай 2:

Ввод: Дата окончания контракта 2022-01 -05

Ожидаемый результат: 2021-01-05 (потому что 2020-01-05 уже пройден)

Я никогда не публиковал вопрос по SO без некоторых код "что вы пробовали до сих пор", но я в полном недоумении. Я полагаю, что мог бы манипулировать датами, и делать несколько прикольных вещей, чтобы узнать, прошла ли дата, и так далее, c. Но над этим требованием кто-либо когда-либо работал, или для вызова? :-) Даже руководство не кодекс поможет. Затем я мог бы отредактировать вопрос с помощью того, что я придумаю.


РЕДАКТИРОВАТЬ:

Перефразируя вопрос другим способом, учитывая будущую дату, как я могу определить следующее возникновение тот день / месяц этой будущей даты, исходя из «сегодня».

В 2020-01-23, взять 2022-07-01 и добраться до 2020-07-01 (следующее вхождение 1 июля)

2020-01-23, взять 2024-01-05 и добраться до 2021-01-05 (следующее вхождение 5 января)

Ответы [ 2 ]

4 голосов
/ 24 января 2020

С помощью DateAdd, cross apply и case - решение проще, чем вы думаете.
Сначала создайте и заполните таблицу образцов ( Пожалуйста, спасите нас на этом шаге в ваших будущих вопросах):

DECLARE @T AS TABLE
(
    ContractEndDate date
);

INSERT INTO @T (ContractEndDate) VALUES
('2022-07-01'), 
('2023-01-05');

Затем я использовал переменную для жесткого кодирования даты, но, естественно, вы должны использовать GetDate() для этого:

DECLARE @Today Date = '2020-01-23';

Сам запрос выглядит так:

SELECT  ContractEndDate, -- This is just for reference
        ThisYear, -- This is just for reference
        -- add a year in case we've passed the date
        CASE WHEN (ThisYear < @Today) 
        THEN 
            ThisYear 
        ELSE 
            DATEADD(YEAR, 1, ThisYear) 
        END As Result
FROM @T
CROSS APPLY
(
    -- Get the date of the contract end in the current year
    SELECT CAST(
            DATEADD(YEAR, YEAR(@Today)-YEAR(ContractEndDate), ContractEndDate)
        As Date) As ThisYear
) t

Результаты:

ContractEndDate     ThisYear    Result
2022-07-01          2022-07-01  2021-07-01  
2023-01-05          2023-01-05  2020-01-05
0 голосов
/ 23 января 2020

Вопрос немного неясен, однако, вы можете выбрать только месяц и день и попытаться сопоставить даты только по ним:

SELECT FORMAT (getdate(), 'dd-MM') as date

Было бы лучше иметь схему, а также создаваемый вами запрос поэтому мы понимаем, в чем проблема.

...