如何编写代码Oracle SQL(如'CCYYMMDD'为102)?如果有人将在前端输入日期,则该值应返回,102而不是日期。为此,将如何在中编写函数Oracle PLSQL。
Oracle SQL
'CCYYMMDD'
102
Oracle PLSQL
https://www.unece.org/trade/untdid/d00a/tred/tred2379.htm 这些是ANSI标准格式。
您可以验证字符串是否适合这样的日期格式:
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()检查字符串的后半部分是有效的月份和日期组合。。
to_date()
请注意,尽管模棱两可,例如,20111012在'YYYYMMDD'或'DDMMYYYY'?除非您通过使用日期选择器小部件或年,月,日的单独输入框在前端输入中强制执行严格的日期格式设置,否则无法确定。
20111012
'YYYYMMDD'
'DDMMYYYY'
为什么在此查询中传递“ 2000”?
第二个检查将验证最后四个字符在月和日是否有效。每当我们进行这种测试时,我们都会遇到leap年的问题。如果仅应用to_date(str, 'MMDD')Oracle,Oracle会将年份默认为当前年份:2018029即使原始输入有效,该障碍也不是有效日期20160229。我的职能通过将year元素固定为2000,这是this年,从而避免了这种情况。
to_date(str, 'MMDD')
2018029
20160229
顺便说一句,如果要在SQL中使用此函数,则需要将返回数据类型更改为varchar2(Y / N标志)或数字(1/0),因为SQL不支持Booolean。