我需要得到两个日期之间的差值,如果差值是84天,我可能会输出2个月14天,我的代码只是给出了总数。以下是代码
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; 输出为:
NUM_MONTHS DIFF_IN_DAYS
2.774193548 84例如,我需要此查询的输出为2个月零14天,否则我不会介意在月份数字之后是否可以获得确切的天数,因为这些天并不是真正的14天,因为所有的月份都不是30天。
发布于 2013-08-14 00:00:16
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结果:
| 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
发布于 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?
发布于 2013-08-15 12:53:33
这就是你所拥有的吗?
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;https://stackoverflow.com/questions/11500098
复制相似问题