关于甲骨文的案子我有个问题。我有一个表,比如说,有两列,我想在这两列的基础上创建第三列。
第一列包含一天和一个月的组合,存储为数字,例如2305-->5月23日、503-->3月5日等。这些值都是有效天或空值。第二列有年份(存储为数字,不为空),例如2019、2018。现在我想在这两个列中创建一个date列,这样如果第一列中的值为null,那么新列应该为null,否则第一列和第二列的concateration将为date。例如
day year result
2305 2018 --> 23/05/2018
505 2019 --> 05/05/2019
NULL 2020 --> NULL
我试过:
CASE WHEN day IS NOT NULL THEN TO_DATE (LPAD (TO_CHAR (day || year), 8, '0'), 'dd/mm/yyyy') ELSE NULL END AS date
但是它抛出了错误“ora-01847月日必须在1和月的最后一天之间”。
我在google上发现,有时case语句中的“then”表达式在检查when条件之前会被求值。这可能是个问题,因为lpad给出的结果在day为null时不能转换为日期。有没有办法绕过这个问题?理想情况下,我想要一些命令,它告诉oracle首先检查day是否为null,然后只计算结果是否为null。还是有别的办法解决我的问题?
致以最诚挚的问候。
2条答案
按热度按时间ykejflvf1#
请使用下面的查询,
使用
LPAD()
```select case when day is null then null else to_char(to_date(lpad(date1, 4, 0)||year1, 'ddMMyyyy'), 'dd/MM/YYYY') as result from table;
select to_char(to_date(lpad(date1, 4, 0)||year1, 'ddMMyyyy'), 'dd/MM/YYYY') from
(select '505' as date1, 2019 as year1 from dual
union all
select '2305' as date1, 2018 as year1 from dual);
案例示例:
ndh0cuux2#
如果你想走这条路,你应该首先转换
day
以及year
要使用文本的字段TO_CHAR
,然后左填充day
最多一个零,最后打电话来TO_DATE
关于这两个字段之间的连接:演示
但请注意,如果您只保留一个适当的日期列来存储日期信息,您的生活会轻松得多。