首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在sql中获取以月和日表示的两个日期之间的差异

在sql中获取以月和日表示的两个日期之间的差异
EN

Stack Overflow用户
提问于 2012-07-16 15:49:09
回答 9查看 110.4K关注 0票数 14

我需要得到两个日期之间的差值,如果差值是84天,我可能会输出2个月14天,我的代码只是给出了总数。以下是代码

代码语言:javascript
复制
SELECT Months_between(To_date('20120325', 'YYYYMMDD'),
       To_date('20120101', 'YYYYMMDD'))
       num_months,
       ( To_date('20120325', 'YYYYMMDD') - To_date('20120101', 'YYYYMMDD') )
       diff_in_days
FROM   dual; 

输出为:

代码语言:javascript
复制
NUM_MONTHS    DIFF_IN_DAYS
2.774193548       84

例如,我需要此查询的输出为2个月零14天,否则我不会介意在月份数字之后是否可以获得确切的天数,因为这些天并不是真正的14天,因为所有的月份都不是30天。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-08-14 00:00:16

代码语言:javascript
复制
select 
  dt1, dt2,
  trunc( months_between(dt2,dt1) ) mths, 
  dt2 - add_months( dt1, trunc(months_between(dt2,dt1)) ) days
from
(
    select date '2012-01-01' dt1, date '2012-03-25' dt2 from dual union all
    select date '2012-01-01' dt1, date '2013-01-01' dt2 from dual union all
    select date '2012-01-01' dt1, date '2012-01-01' dt2 from dual union all
    select date '2012-02-28' dt1, date '2012-03-01' dt2 from dual union all
    select date '2013-02-28' dt1, date '2013-03-01' dt2 from dual union all
    select date '2013-02-28' dt1, date '2013-04-01' dt2 from dual union all
    select trunc(sysdate-1)  dt1, sysdate               from dual
) sample_data

结果:

代码语言:javascript
复制
|                        DT1 |                       DT2 | MTHS |     DAYS |
----------------------------------------------------------------------------
|  January, 01 2012 00:00:00 |   March, 25 2012 00:00:00 |    2 |       24 |
|  January, 01 2012 00:00:00 | January, 01 2013 00:00:00 |   12 |        0 |
|  January, 01 2012 00:00:00 | January, 01 2012 00:00:00 |    0 |        0 |
| February, 28 2012 00:00:00 |   March, 01 2012 00:00:00 |    0 |        2 |
| February, 28 2013 00:00:00 |   March, 01 2013 00:00:00 |    0 |        1 |
| February, 28 2013 00:00:00 |   April, 01 2013 00:00:00 |    1 |        1 |
|   August, 14 2013 00:00:00 |  August, 15 2013 05:47:26 |    0 | 1.241273 |

测试链接:SQLFiddle

票数 21
EN

Stack Overflow用户

发布于 2013-08-15 15:13:50

我认为你的问题定义得不够好,原因如下。

依赖于months_between的答案必须处理以下问题:该函数在2013-02-28和2013-03-31之间、2013-01-28和2013-02-28之间以及2013-01-31和2013-02-28之间恰好报告了一个月(我怀疑一些回答者在实践中没有使用这些函数,或者现在必须检查一些生产代码!)

这是记录在案的行为,在这种行为中,日期都是各自月份的最后一天或落在该月的同一天,则被判断为相隔整数个月。

因此,当将2013-02-28与2013-01-28或2013-01-31进行比较时,您会得到相同的结果"1“,但将其与2013-01-29或2013-01-30进行比较,结果分别为0.967741935484和0.935483870968 --因此,当一个日期接近另一个日期时,此函数报告的差异可能会增大。

如果这不是一种可接受的情况,那么你将不得不编写一个更复杂的函数,或者仅仅依赖于假设每月30天(例如)的计算。在后一种情况下,您将如何处理2013-02-28和2013-03-31?

票数 2
EN

Stack Overflow用户

发布于 2013-08-15 12:53:33

这就是你所拥有的吗?

代码语言:javascript
复制
select trunc(months_between(To_date('20120325', 'YYYYMMDD'),to_date('20120101','YYYYMMDD'))) months,
             round(To_date('20120325', 'YYYYMMDD')-add_months(to_date('20120101','YYYYMMDD'),
                           trunc(months_between(To_date('20120325', 'YYYYMMDD'),to_date('20120101','YYYYMMDD'))))) days
        from dual;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11500098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档