Oracle SQL从零件创建日期

时间:2017-03-13 17:14:08

标签: sql oracle

我在数据库中有两个日期字段,名为“EFFECTIVE_DATE”和“POINT_DATE”

如何创建新的日期字段,其中日期由“EFFECTIVE_DATE”年份,“POINT_DATE”月份和“POINT_DATE”日组成?

我通常会使用Datefromparts,但这是Oracle数据库而不是Microsoft

亲切的问候

3 个答案:

答案 0 :(得分:2)

以下是使用ADD_MONTHSEXTRACT(YEAR FROM ....)的方法。您只需添加或减去所需的月数(总是12的倍数,因为您只更改年份)。与TO_CHAR / TO_DATE解决方案不同,此方法处理闰日(2月29日)。另一方面,请注意,将日期从2003年2月28日更改为2012年将更改为2月29日(ADD_MONTHS将一个月的最后一天更改为结果月份的最后一天)。

with
     inputs as (
       select date '2013-03-22' as effective_date,
              date '2017-08-14' as point_date
       from   dual
     )
-- end of TEST data (do not include in the solution!)
select effective_date, point_date,
       add_months(point_date, 12 * ( extract (year from effective_date) - 
                                     extract (year from point_date)     )
                 ) as mixed_date
from   inputs;

EFFECTIVE_DATE  POINT_DATE  MIXED_DATE
--------------  ----------  ----------
03/22/2013      08/14/2017  08/14/2013

答案 1 :(得分:1)

假设所有coulmns都是DATE数据类型,您可以使用此

TO_DATE(TO_CHAR(EFFECTIVE_DATE, 'YYYY') || TO_CHAR(POINT_DATE, 'MMDD'), 'YYYYMMDD')

注意闰年!

答案 2 :(得分:1)

嗯。嗯。 。 。这会产生一个YYYY-MM-DD格式的好字符串:

select to_char(effective_date, 'YYYY') || '-' || to_char(point_date, 'MM-DD')

然后将其解析为日期:

select to_date(to_char(effective_date, 'YYYY') || '-' || to_char(point_date, 'MM-DD'), 'YYYY-MM-DD')

注意:2月29日你可能要小心。