Как добавить количество дней, определяемых переменной с плавающей запятой, к дате в SQL - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть переменная float, которая описывает срок в месяцах. Мне нужно иметь возможность добавить этот период к определенной дате.

Я создал простой лог c, такой как:

DECLARE @monthsTerm  AS float = 2;
Select DATEADD(dd,((CAST(@monthsTerm AS INT) % 1) / 0.25 * 7), (DATEADD(mm, CAST(@monthsTerm AS INT), '2018-01-01')))  AS [Subscription end date]

Проблема возникает, когда я хочу установить monthsTerm переменная на 1, 2 или 3 недели и др. c. промежуток времени. Таким образом, в течение двух недель переменная будет выглядеть так:

DECLARE @monthsTerm  AS float = 0.5;

, и я ожидаю получить '2018-01-15' в результате, но теперь она возвращает '2018-01-01', что неверно.

Я думал о переносе выражения просто в:

Select DATEADD(dd,((@monthsTerm % 1) / 0.25 * 7), (DATEADD(mm, CAST(@monthsTerm AS INT), '2018-01-01')))  AS [Subscription end date]

, однако я получаю исключение:

The data types float and int is incompatible in the modulo operator.

Я знаю, что, например, подобное выражение будет работать в C#:

public DateTime EndDate
=> StartDate.AddMonths((int)TermMonths).AddDays((TermMonths % 1) / 0.25 * 7);

Есть ли какой-нибудь простой способ обойти это, чтобы у меня было только одно простое выражение с Select DATEADD(.., или мне нужно в конечном итоге найти более сложное решение? Приветствия

1 Ответ

1 голос
/ 25 февраля 2020
Select
    cast((CAST(@monthsTerm*100 as int) % 100)*7 /0.25/100 as int) as days ,                                  
    (((CAST(@monthsTerm*100 as int) % 100)/100) / 0.25 * 7),
    DATEADD(dd,cast((CAST(@monthsTerm*100 as int) % 100)*7 /0.25/100 as int), (DATEADD(mm, CAST(@monthsTerm AS INT), '2018-01-01')))  AS [Subscription end date]

Умножение на 100 и деление на 100 после %

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...