我正在将一些计算从FORTRAN转换为PL / SQL。 请让我解释一下:
在我的Oracle数据库表中,我有两个属性的以下日期值。
attribute1: '01/01/0001', This is a date not a string.
attribute2: '08/24/1918', This is a date not a string.
我想要做的是,如果attribute1等于'01 / 01/0001',则将其转换为00/00/0000然后减去attribute2,就像下面的代码一样:
//Decode missing for '01/01/0001'
select round((to_date('01/01/0001', 'mm/dd/yyyy') - to_date('01/24/1918', 'mm/dd/yyyy'))/365.25, 3)as dt from dual;
FORTRAN代码正在做的是将'01 / 01/0001'转换为'0/0/0',然后执行减号。像这样,
round((('0/ 0/ 0' - '08/24/1918') / 365.25), 3). Round to the 3 decimal place.
我知道我在上面的PL / SQL代码中缺少一个解码,基本上将'01 / 01/0001'转换为零。
运行PL / SQL代码,您将获得-1917.027的值。 FORTRAN代码返回值-1918.732。 PL / SQL代码关闭了一天,一个月和一年。
如何将'01 / 01/0001'转换为零,然后将其减去日期??
请提供帮助,并提前致谢。
答案 0 :(得分:1)
在我看来,使用CASE
语句会更容易。类似的东西:
CASE
WHEN attribute1 = '01/01/0001' THEN -1*(EXTRACT(YYYY FROM attribute2)+ EXTRACT(DDD FROM attribute2)/365)
ELSE attribute1 - attribute2
END
或者,您可以将所有内容转换为Julian日期,然后使用日期为01/01/0001的修正系数进行减法