case和tou-date

yyyllmsg  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(176)

关于甲骨文的案子我有个问题。我有一个表,比如说,有两列,我想在这两列的基础上创建第三列。
第一列包含一天和一个月的组合,存储为数字,例如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。还是有别的办法解决我的问题?
致以最诚挚的问候。

ykejflvf

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;

lpad示例:

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);

使用 `CASE` ```
select case when day is null then null else 
to_date((case when length(day) = 3 then '0'||ltrim(rtrim(day)) else ltrim(rtrim(day)) 
end)||ltrim(rtrim(year)), 'ddMMyyyy') end as result 
from table;

案例示例:

select to_date((case when length('505') = 3 then '0'||ltrim(rtrim('505')) else ltrim(rtrim('505')) end)||'2019', 'ddMMyyyy') as result from dual;
select to_date('2305'||'2019', 'ddMMyyyy') as result from dual;
ndh0cuux

ndh0cuux2#

如果你想走这条路,你应该首先转换 day 以及 year 要使用文本的字段 TO_CHAR ,然后左填充 day 最多一个零,最后打电话来 TO_DATE 关于这两个字段之间的连接:

SELECT
    day,
    year,
    CASE WHEN day IS NOT NULL
         THEN TO_DATE(LPAD(TO_CHAR(day), 4, '0') || TO_CHAR(year), 'ddmmyyyy') END AS "date"
FROM yourTable;

演示

但请注意,如果您只保留一个适当的日期列来存储日期信息,您的生活会轻松得多。

相关问题