计算oracle中的年,月,日

时间:2014-09-24 13:36:40

标签: sql oracle date

我正在开发一个程序,它采用开始日期和结束日期,并返回年,月和日的单独值。每个类别都有自己的代码部分,这是我一直在使用的,到目前为止它一直是半精确的,直到几天(有时几个月。我甚至不想在这一点上愚弄傻瓜)

Ex开始:04/10/2000结束: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

感谢您的时间,因为您想知道这是一份工作经验计算器:)

1 个答案:

答案 0 :(得分:0)

请参考以下示例: http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#SQLRF50992

您绝对可以使用以下逻辑来计算年份和月份。就日子而言 - 2月28日+ 1个月回归3月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
)