sql - 如何获得两个日期之间的确切月数?

标签 sql sql-server monthcalendar

DATEDIFF(MONTH, '1/1/2014', '12/31/2014') + 1

这会给我 12。

如果我这样做会怎样:

DATEDIFF(MONTH, '1/1/2014', '12/30/2014') + 1

它应该给我 11 分的东西。如何获得这两个日期之间的确切月数?这需要适用于任何日期组合(任何一年的任何月份)。

最佳答案

您可以通过以下方式自行计算:

DECLARE @startdate date = '1/1/2014'
DECLARE @enddate date = '12/30/2014'

DECLARE @startday int = DATEPART(DAY, @startdate)
DECLARE @endday int = DATEPART(DAY, @enddate)
DECLARE @startdateBase date = DATEADD(DAY, 1 - @startday, @startdate)
DECLARE @enddateBase date = DATEADD(DAY, 1 - @endday, @enddate)

DECLARE @deciMonthDiff float = CAST(DATEDIFF(MONTH, @startdate, @enddate) AS float) -
  (@startday - 1.0) / DATEDIFF(DAY, @startdateBase, DATEADD(MONTH, 1, @startdateBase)) +
  (@endday - 1.0) / DATEDIFF(DAY, @enddateBase, DATEADD(MONTH, 1, @enddateBase))

SELECT @deciMonthDiff

这计算出 @deciMonthDiff 为 11.935483870967。
当然,您可以尽可能多地“内联”它,以避免所有中间声明。

想法是计算总月差异,然后根据实际日期减去第一个月和最后一个月的相对部分。

关于sql - 如何获得两个日期之间的确切月数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30877178/

相关文章:

c# - 首先附加现有数据库 Entity Framework 代码时出错

sql - uniqueidentifier 跨数据库唯一吗?

sql - 连接声明的列并定义它时,sql如何返回所有行?

c# - 部分 MonthCalendar 本地化失败 ('Today' 标签未翻译)

c# - MonthCalendar.SelectionRange 数据绑定(bind)示例

php - 将字段添加到数据库/覆盖现有下拉列表中的默认选项

sql - 如何编写 SQL 脚本以获得所需的输出

python - 根据缺失时间范围自动填充数据库中缺失的行

sql - 如何调整表包含 30,000 多行的 7 表连接 MySQL 计数查询?

php - joomla 下拉菜单中的几个月数据