Добавить неполный месяц к сумме за месяц в SQL - PullRequest
0 голосов
/ 07 августа 2020

Чтобы выполнить некоторые вычисления в моей таблице, мне нужно взять все месяцы между датами начала и окончания. Однако, чтобы расчет работал правильно, мне нужно включить часть начального месяца.

Вот пример того, что я сейчас делаю. Это даст мне количество месяцев между датой начала и окончания.

DepreciationPeriods -  DateDiff(Month, AcquisitionDate, @STARTDATE)  END as RemainingPeriodAsOfStartDate

Однако AcquisitionDate не всегда происходит 1-го числа месяца. Следовательно, если Acquistiondate приходится на 15 июня, а дата окончания - 1 августа. Я хочу, чтобы результат был 1,5 месяца, а не 2 месяца, как в настоящее время код дает

Я пробовал следующую строку:

 DepreciationPeriods -  DateDiff(Month, AcquisitionDate, @STARTDATE) + cast(EOMONTH(acquisitiondate as int) / cast( day(AcquisitionDate as int)) -1)

Однако я все еще получаю ошибку:

Сообщение 156, уровень 15, состояние 10, строка 19 Неправильный синтаксис рядом с ключевым словом «AS».

1 Ответ

0 голосов
/ 07 августа 2020

Вы должны понимать, что DATEDIFF не подсчитывает количество интервалов между двумя датами, а подсчитывает количество раз, когда указанный интервал изменяется между двумя датами. В качестве крайнего примера, если вы попросите DATEDIFF сказать вам количество лет между '1999-12-31 23:59:59' и '2000-01-01 00:00:01', он скажет, что они находятся с разницей в год (с разницей в 1 год), даже если они находятся всего в двух секундах, потому что год изменился один раз. (1999-> 2000) между двумя датами

Таким образом, поскольку вам нужен некоторый дробный элемент «количества интервалов» между двумя датами, вам придется использовать более мелкий интервал, например дни (если вы хотите количество месяцев) или секунды (если вы хотите количество минут) между вашими датами, а затем разделите этот интервал (150 минут между двумя датами, деленное на 60,0, дает 2,5 часа, чтобы получить приближение (вы должны принять что время 00:00:00 - 02:30:59 почти на две полные минуты длиннее, чем 00:00:59 - 02:30:00, но интервал минут по-прежнему изменялся одинаковое количество раз) от целого.

В данном конкретном случае это неприятно, потому что месяцы различаются по продолжительности , поэтому даже если у вас есть две даты, например 1-е число одного месяца и 15-е число другого, они не всегда с промежутком в 1,5 месяца, потому что 15-е число не всегда составляет половину месяца (15/28 против 15/31)

Если вы можете терпеть это, то используйте, например, дни в своем датировке и что-то вроде среднего количества дней в месяце

Если вы не можете этого терпеть, возможно, получите продолжительность месяца (DAY(EOMOTH(date))), на которую попадает ваша «половина месяца», будь то дата начала или дата окончания, и вычислите, что день в этом месяце соответствует "половине месяца" (т.е. между 28/2 и 31/2)

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