Sql 如何在firebird函数datediff(包括闰年)中获得正确的年、月和日

Sql 如何在firebird函数datediff(包括闰年)中获得正确的年、月和日,sql,firebird,date-arithmetic,firebird2.5,Sql,Firebird,Date Arithmetic,Firebird2.5,我需要一个解决方案扩展,我收到的,它是在链接可见。我认为我的解决方案是正确的,但结果表明,我得到的结果与几天来手工计算的结果不同。分析表明,造成这种差异的原因是闰年。有没有人知道如何更新此查询以在计算日期时包含闰年 我对Livius的sql查询如下: 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

我需要一个解决方案扩展,我收到的,它是在链接可见。我认为我的解决方案是正确的,但结果表明,我得到的结果与几天来手工计算的结果不同。分析表明,造成这种差异的原因是闰年。有没有人知道如何更新此查询以在计算日期时包含闰年

我对Livius的sql查询如下:

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

例如,我得到了从2011-11-02到2014-08-31的时间间隔。当我使用这个查询时,我得到的结果是2Y 9M 29D。但当我计算这个的时候,我得到的结果是2y9m30d。这是一天不同,因为2012年有366天,而不是365天,因为2012年是闰年。

您应该真正展示您正在使用的代码示例、Firebird返回的内容以及您实际需要的内容。好的,稍等片刻,我更新了我的问题。你的预期是否成立:2011-11-02+2年是2013-11-02+9个月是2014-08-02+29天是2014-08-31。你如何得出结论,应该是2年9月30日?(根据我的计算是2014-09-01)。闰年应该不重要,除非在闰年的二月开始。我看不出有什么错误。因为月份和年份彼此不同,所以无法以月份为单位正确测量时间距离。这就像测量城市的地理距离。有多少纽约位于伦敦和巴黎之间?厄尔布鲁斯山有多少华沙高?你不可能有任何数学上正确的答案。因此,你只能用不精确的估计来回答。适合在街头随意交谈。因此,您的
DateDiff
查询只给出了完全有效的答案“2Y 10M给予或需要几天”-答案在上下文中是有效的。另外,假设您得到了大约6Y的跨度,您应该考虑多少闰年?在1999年至2004年的“6年”中有两个闰年,但在1998年至2003年的同一“6年”中只有一个闰年。还有千禧年,2000年是闰年,1900年不是。同样的“滑动窗口”问题会让你在像“110Y”这样的时间跨度中获得不确定的闰年数。如果你想用“年”和“月”来计算时间跨度,你必须同意这使得事情变得简单、简单和不精确。3年内的一天不匹配是正常的,是吗?你应该展示你正在使用的代码的例子,Firebird返回的代码和你真正想要的。好的,等一下,我更新我的问题。你的预期是否成立:2011-11-02+2年是2013-11-02+9个月是2014-08-02+29天是2014-08-31。你如何得出结论,应该是2年9月30日?(根据我的计算是2014-09-01)。闰年应该不重要,除非在闰年的二月开始。我看不出有什么错误。因为月份和年份彼此不同,所以无法以月份为单位正确测量时间距离。这就像测量城市的地理距离。有多少纽约位于伦敦和巴黎之间?厄尔布鲁斯山有多少华沙高?你不可能有任何数学上正确的答案。因此,你只能用不精确的估计来回答。适合在街头随意交谈。因此,您的
DateDiff
查询只给出了完全有效的答案“2Y 10M给予或需要几天”-答案在上下文中是有效的。另外,假设您得到了大约6Y的跨度,您应该考虑多少闰年?在1999年至2004年的“6年”中有两个闰年,但在1998年至2003年的同一“6年”中只有一个闰年。还有千禧年,2000年是闰年,1900年不是。同样的“滑动窗口”问题会让你在像“110Y”这样的时间跨度中获得不确定的闰年数。如果你想用“年”和“月”来计算时间跨度,你必须同意这使得事情变得简单、简单和不精确。三年内一天的不匹配是正常的,可以吗