2014-09-24 48 views
2

我正在开发的程序需要开始日期和结束日期,并为年,月和日返回单独的值。每个类别都有自己的代码段,这是我一直使用的,迄今为止它一直是半精确的,直到几天(有时甚至是几个月。我甚至不想在这一点上蠢蠢欲动)计算年,月,日在oracle中

Ex Start:04/10/2000 End:04/10/2006应该给我6年0个月零0天。

年代号:

SELECT 
trunc(months_between((to_date(:main_DT_DateEnd1,'MM/DD/YYYY')),(to_date(:main_DT_DateBeg1,'MM/DD/YYYY')))/12) as "Years1" 
FROM dual 

月代码:

SELECT 
    trunc(mod(months_between((to_date(:main_DT_DateEnd1,'MM/DD/YYYY')),(to_date(:main_DT_DateBeg1,'MM/DD/YYYY'))), 12)) as "Months1" 
FROM dual 

天代码:我已经试过的这些多个版本,而不例如很成功,我可以计算出日之间的总天数,但既然有在某些日子里不同的月份会变得更加麻烦。这是我得到的最接近的地方,如果天数相同,则不需要计算,否则使用子串来减去它们。 1)

SELECT 

CASE 
WHEN substr((to_date(:main_DT_DateBeg1,'MM/DD/YYYY')),4,5) = substr((to_date(:main_DT_DateEnd1,'MM/DD/YYYY')),4,5) 
THEN 0 

WHEN substr((to_date(:main_DT_DateBeg1,'MM/DD/YYYY')),4,5) < substr((to_date(:main_DT_DateEnd1,'MM/DD/YYYY')),4,5) 
THEN to_number(substr((to_date(:main_DT_DateEnd1,'MM/DD/YYYY')),4,5)) - to_number(substr((to_date(:main_DT_DateBeg1,'MM/DD/YYYY')),4,5)) 

END as "Days_1" 

FROM dual 

感谢您的时间,对于那些你想知道这是一个工作经验计算器:)

+4

我问过同样的问题http://stackoverflow.com/questions/11500098/get-the-在两个日期之间的差异,在两个月和天在SQL中,并得到很好的答案 – ErrorNotFoundException 2014-09-24 13:52:40

+0

这是否帮助https://community.oracle.com/thread/826651?start=0&tstart=0 – 2014-09-24 13:52:58

+0

我会看看这个斯坦利我有一个类似的答案,使用不同的月份格式(也许这就是区别),谢谢lalit我也会考虑这一个。我在该帖子中尝试了6篇帖子,并且确实关闭了。感谢你目前的帮助! – 2014-09-24 14:12:17

回答

0

请参考这里的例子: http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#SQLRF50992

你绝对可以使用以下计算年和月的逻辑。就日期而言 - 这对于2月28日+ 1月31日回报有点棘手......

select extract(year from (d2 - d1) year to month), 
     extract(month from (d2 - d1) year to month), 
     add_months(d1, extract(year from (d2 - d1) year to month)*12 + extract(month from (d2 - d1) year to month)) - d2 
from (
select date'2014-08-27' as d2, date'2002-02-27' as d1 
    from dual 
)