Excel计算两日期间特定月份住宿晚数问题求助
修正跨月住宿晚数计算公式
你的思路方向是对的,问题出在原公式没有考虑退房当天不算住宿晚数的核心逻辑——你用B3-A3计算总晚数时,本质上是默认退房当天的夜晚不算住宿(比如15/01到25/01,实际是住到24/01的晚上,共10晚),但原公式在计算当月晚数时,没有把退房日期往前推一天,导致跨月时少算1晚。
修正后的公式
把D列的公式替换为:
=MAX(0, MIN(EOMONTH(D$1,0), $B3-1) - MAX(D$1, $A3) + 1)
公式逻辑拆解
我们一步步看为什么这样改:
$B3-1:将退房日期提前1天,因为退房当天的夜晚不属于住宿时段,这和你总晚数B3-A3的逻辑保持一致。MIN(EOMONTH(D$1,0), $B3-1):取当月最后一天和退房前一天中更早的日期,确保我们只计算当月内的住宿结束点。MAX(D$1, $A3):取当月第一天和入住日期中更晚的日期,确保我们只计算当月内的住宿起始点。[结束日期]-[起始日期]+1:计算这段区间内的住宿晚数(加1是因为要包含入住当天的夜晚)。MAX(0, ...):兜底处理负数情况(比如入住日期在当月之后,或退房日期在当月之前,此时当月晚数为0)。
验证你的例子
- D2单元格(15/01入住,25/01退房):
MIN(31/01,24/01)=24/01,MAX(01/01,15/01)=15/01,24-15+1=10,结果正确。 - D3单元格(28/01入住,04/02退房):
MIN(31/01,03/02)=31/01,MAX(01/01,28/01)=28/01,31-28+1=4,正好得到你需要的结果。
这个公式可以直接下拉填充到所有月份列,混合引用的设置(D$1锁定行,$A3/$B3锁定列)会自动适配不同行和列的日期。
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

