小编典典

如何在Oracle SQL中编写代码(例如将“ CCYYMMDD”写入102)

sql

如何编写代码Oracle SQL(如'CCYYMMDD'102)?如果有人将在前端输入日期,则该值应返回,102而不是日期。为此,将如何在中编写函数Oracle PLSQL

https://www.unece.org/trade/untdid/d00a/tred/tred2379.htm
这些是ANSI标准格式。


阅读 188

收藏
2021-04-15

共1个答案

小编典典

您可以验证字符串是否适合这样的日期格式:

create or replace function is_CCYYMMDD 
    (p_str in varchar2)
    return boolean
is
    rv boolean;
    dt date;
begin
    begin
        dt := to_date(p_str, 'YYYYMMDD');
        dt := to_date('2000' || substr(p_str, 5), 'YYYYMMDD');
        rv := true; 
    exception
        when others then
            rv := false;
    end;
    return rv;
end;

第一个to_date()只是检查整个字符串是否为有效日期。第二个to_date()检查字符串的后半部分是有效的月份和日期组合。。

请注意,尽管模棱两可,例如,20111012'YYYYMMDD''DDMMYYYY'?除非您通过使用日期选择器小部件或年,月,日的单独输入框在前端输入中强制执行严格的日期格式设置,否则无法确定。

为什么在此查询中传递“ 2000”?

第二个检查将验证最后四个字符在月和日是否有效。每当我们进行这种测试时,我们都会遇到leap年的问题。如果仅应用to_date(str, 'MMDD')Oracle,Oracle会将年份默认为当前年份:2018029即使原始输入有效,该障碍也不是有效日期20160229。我的职能通过将year元素固定为2000,这是this年,从而避免了这种情况。


顺便说一句,如果要在SQL中使用此函数,则需要将返回数据类型更改为varchar2(Y / N标志)或数字(1/0),因为SQL不支持Booolean。

2021-04-15