sql - 如何在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 个月增加一年的价值。请帮我...
解决方案
您应该先对天数求和,然后对结果求和,然后计算 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
推荐阅读
- python - 如何创建一个倒排索引,其中包含有关每个文档中每个单词出现次数的信息
- java - 如何将 jaspersoft 与动态 Web 应用程序集成
- c# - 从应用程序使用 API 时跳过 DocuSign 登录请求
- cassandra - Cassandra multinode cluster setup issue (for example 3 nodes)
- powershell - 用文件名中的特殊字符重命名多个文件
- spring-boot - Spring Boot API : If any field is empty in request body it is storing as null in DB
- java - 如何使用 jdeps 分析 fat jar(spring-boot)的依赖关系?
- maple - Taylor series vs numeric solution of nonlinear DE in maple
- python - 无法显示原图使用opencv-python 3.4
- javascript - 浏览器中的 Javascript 添加了哪些功能