我在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