首页 > 解决方案 > 如何在firebird函数datediff中获得正确的年月日

问题描述

我不得不问另一个关于 Firebird 中 datediff 的问题。在这种情况下我不知道如何得到正确的结果:工人 x 有两个雇佣合同,第一个在 1988-09-15 到 2000-03-16 期间,第二个从 2000-03-16 到 2005-02- 28. 我想得到的结果是16年5个月3天,因为第一个结果是11年6个月1天,第二个结果是4年11个月2天。有谁可以告诉我如何在firebird中做到这一点。我最想知道如何从月的总和(17 个月)中做 5 个月,而其他 12 个月增加一年的价值。现在我有这样的 SQL:

SELECT
a.id_contact, 
sum(floor(datediff(day, a.DATE_FROM, a.DATE_TO)/365.25)) as YEAR,
mod(sum(mod(floor(datediff(day, a.DATE_FROM, a.DATE_TO)/30.41),12)),12) as MTH
FROM KP a
group by a.id_contact

然后我得到 5 个月,但我没有 12 个月增加一年的价值。请帮我...

标签: sqlfirebird2.5

解决方案


您应该先对天数求和,然后对结果求和,然后计算 Y、M、D

SELECT
KP3.id_contact 
, (KP3.D2-KP3.D1) / (12*31) AS Y
, ((KP3.D2-KP3.D1) - ((KP3.D2-KP3.D1) / (12*31)) * 12 * 31) / 31 AS M
, CAST(MOD((KP3.D2-KP3.D1) - (((KP3.D2-KP3.D1) / (12*31)) * 12 * 31), 31) AS INTEGER) AS D
FROM
(SELECT
KP2.id_contact, SUM(KP2.D1) AS D1, SUM(KP2.D2) AS D2
FROM
    (
    SELECT
    KP.id_contact, DATEDIFF(MONTH, KP.DATE_FROM, KP.DATE_TO) / 12 AS Y, CAST(MOD(DATEDIFF(MONTH, KP.DATE_FROM, KP.DATE_TO), 12) AS INTEGER) AS M 
    , EXTRACT(YEAR FROM KP.DATE_FROM)*12*31+EXTRACT(MONTH FROM KP.DATE_FROM)*31+EXTRACT(DAY FROM KP.DATE_FROM) D1
    , EXTRACT(YEAR FROM KP.DATE_TO)*12*31+EXTRACT(MONTH FROM KP.DATE_TO)*31+EXTRACT(DAY FROM KP.DATE_TO) D2 
    FROM
    KP  
    ) AS KP2
GROUP BY KP2.id_contact
) AS KP3

推荐阅读