在sql中添加部分逐月合计

7rtdyuoh  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(333)

为了完成表中的一些计算,我需要在开始日期和结束日期之间花费所有的月份。但是,为了使计算正常工作,我需要能够包括开始月份的一部分。
这是我目前正在做的一个例子。这将给我开始和结束日期之间的月数。

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

然而,收购日期并不总是在本月1日进行。因此,如果收购日期是6月15日,结束日期是8月1日,我希望结果是1.5个月,而不是代码目前给出的2个月
我试过以下几句话:

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

但是,我仍然收到错误:
msg 156,级别15,状态10,第19行关键字“as”附近的语法不正确。

jdgnovmf

jdgnovmf1#

您需要了解datediff不计算两个日期之间的间隔次数,而是计算两个日期之间指定间隔更改的次数。作为一个极端的例子,如果你让datediff告诉你 '1999-12-31 23:59:59' 以及 '2000-01-01 00:00:01' 它会说它们相隔一年(相差一年),尽管它们只相差两秒,因为这两个日期之间的年份变化了一次(1999年->2000年)
因此,由于您希望在两个日期之间使用“间隔数”的小数元素,因此您必须在日期之间使用更细粒度的间隔,如天(如果您希望使用月数)或秒(如果您希望使用分钟数),然后除以该间隔(两个日期之间150分钟,除以60.0得到2.5小时的近似值(你必须接受 00:00:00 - 02:30:59 差不多比我长了整整两分钟 00:00:59 - 02:30:00 但分钟间隔仍然改变了(相同的次数)的整体。
在这种特殊情况下,这很麻烦,因为月份的长度不同,所以即使你有两个日期,例如一个月的第一天和另一个月的第15天,它们也不总是相隔1.5个月,因为第15天并不总是半个月(15/28比15/31)
如果你能忍受这一点,那么在你的datediff中使用例如days和一个月的平均天数
如果你不能忍受它,也许得到一个月的长度( DAY(EOMOTH(date)) )你的“半个月”是开始日期还是结束日期,并计算该月的哪一天等于“半个月”(即28/2和31/2之间)

相关问题