VBA转SQL:DateDiff函数计算结果差异问题排查
MS Access查询计算逻辑差异问题分析
原MS Access查询的计算逻辑(contractualDate与ContractualTime均为datetime类型):
(Max(([contractualDate]+[ContractualTime]))-Min(([contractualDate]+[ContractualTime])))*25,0) AS TrailerCost
注:原语句存在语法错误,推测应为(Max(([contractualDate]+[ContractualTime]))-Min(([contractualDate]+[ContractualTime])))*25 AS TrailerCost(多余的,0大概率是笔误)
你尝试替代的SQL语句:
Datediff(m,Min(([contractualDate]+[ContractualTime])),Max(([contractualDate]+[ContractualTime])))*25 AS TrailerCost
两者结果存在差异的核心原因:
- 原Access逻辑中,两个datetime直接相减得到的是带小数的天数:比如时间差12小时会得到0.5,差3小时得到0.125,乘以25是按「每日25的成本」计算总费用。
- 你使用的
DATEDIFF(m, ...)是计算两个日期的整月份差:它只统计月份的整数变化,比如从2024-01-31到2024-02-01,该函数会返回1,但实际时间差仅1天,和原逻辑的天数计算维度完全不同。
要对齐原逻辑,需按「天数(含小数)」计算:
如果是标准SQL环境,可通过计算小时差再转换为天数来实现:
(TIMESTAMPDIFF(HOUR, Min([contractualDate]+[ContractualTime]), Max([contractualDate]+[ContractualTime]))/24)*25 AS TrailerCost
如果是在MS Access SQL中,直接修正原语句的语法错误即可沿用原逻辑,因为Access支持datetime直接相减得到带小数的天数差。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

