如何在AS400中用SQL计算两个YYYYMMDD格式日期的月份差
问题原因
你原查询仅提取两个日期的月份数值做减法,测试用的TO_DATE和FROM_DATE月份均为7,相减自然得到0,没有把年份差异换算成月份叠加计算。
解决方案
方案1:年月差直接计算(符合你的测试场景需求)
直接把年份差乘以12后叠加月份差,即可得到总间隔月份,测试场景下计算结果为24,完全符合预期:
SELECT (YEAR(TO_DATE) - YEAR(FROM_DATE)) * 12 + (MONTH(TO_DATE) - MONTH(FROM_DATE)) AS Months FROM GREY WHERE ID='1234'
方案2:带日期判断的精准计算(可选)
如果业务要求TO_DATE的日期小于FROM_DATE的日期时,要扣除1个月的未满整月差值,可以增加判断逻辑:
SELECT (YEAR(TO_DATE) - YEAR(FROM_DATE)) * 12 + (MONTH(TO_DATE) - MONTH(FROM_DATE)) - CASE WHEN DAY(TO_DATE) < DAY(FROM_DATE) THEN 1 ELSE 0 END AS Months FROM GREY WHERE ID='1234'
方案3:使用DB2 for i内置函数计算
AS400配套的DB2 for i数据库支持TIMESTAMPDIFF内置函数计算时间间隔,参数64代表返回月份单位的差值:
SELECT TIMESTAMPDIFF(64, CHAR(TIMESTAMP(TO_DATE) - TIMESTAMP(FROM_DATE))) AS Months FROM GREY WHERE ID='1234'
注意:如果你的
TO_DATE、FROM_DATE字段是数值型存储的8位YYYYMMDD值,需要先转成日期类型再计算,转换方式为DATE(TIMESTAMP_FORMAT(CHAR(字段名), 'YYYYMMDD'))。
内容的提问来源于stack exchange,提问作者Chennai Cheetah
相关产品推荐
相关产品推荐

