两个日期之间的完整日历月



我在SQL Server数据库中有两个日期(比如2020-09-15和2020-12-10(,我需要找出这两个日期之间有多少完整的日历月。

在我的例子中,输出应该是"0";2〃;因为十月和十一月是唯一完整的日历月。

提前感谢!

您可以这样做:

select t.*, 
datediff(month, start_date, end_date) 
- case when day(end_date) <  day(start_date) then 1 else 0 end 
as month_diff
from mytable t

datediff()统计两个日期内存在的月末边界的数量。如果结束日期的月份的日期小于开始日期的日期,则我们可以通过减去1来调整结果。

DB Fiddle上的演示

select t.*, 
datediff(month, start_date, end_date) 
- case when day(end_date) <  day(start_date) then 1 else 0 end 
as month_diff
from (values 
('2020-09-15', '2020-12-10'), 
('2020-09-15', '2020-12-17')
) t(start_date, end_date)
start_date|end_date|month_diff:--------|:--------|--------:2020-09-15|2020-12-10|22020-09-15|2020-12-17|3

使用SQL Server的datetime函数检查date1是否是一个月的第一天,date2是否是该月的最后一天,因此可以计算差异:

WITH cte(date1, date2) AS (
SELECT '2020-09-15', '2020-12-10' UNION ALL
SELECT '2020-09-01', '2020-12-10' UNION ALL
SELECT '2020-09-15', '2020-12-31' UNION ALL
SELECT '2020-09-15', '2020-10-31' UNION ALL
SELECT '2020-09-15', '2020-09-30' UNION ALL
SELECT '2020-09-01', '2020-09-30'
)
SELECT *, 
DATEDIFF(
MONTH,
CASE DAY(date1) 
WHEN 1 THEN DATEADD(DAY, -1, date1)
ELSE EOMONTH(date1)
END,
CASE 
WHEN DAY(date2) = DAY(EOMONTH(date2)) THEN date2
ELSE DATEADD(MONTH, -1, EOMONTH(date2))
END
) diff_in_full_months  
FROM cte

请参阅演示
结果:

> date1      | date2      | diff_in_full_months
> :--------- | :--------- | ------------------:
> 2020-09-15 | 2020-12-10 |                   2
> 2020-09-01 | 2020-12-10 |                   3
> 2020-09-15 | 2020-12-31 |                   3
> 2020-09-15 | 2020-10-31 |                   1
> 2020-09-15 | 2020-09-30 |                   0
> 2020-09-01 | 2020-09-30 |                   1

最新更新