日期格式校验

CREATE OR REPLACE FUNCTION FN_ISDATE(V_DATESTR VARCHAR2 --日期入参
) RETURN NUMBER – 返回1为正确,0为错误。
AS
/------------------------------------------------------------------------
公用函数:日期检查函数
调用范例: SELECT FN_ISDATE(‘20140501’) FROM DUAL;
------------------------------------------------------------------------
/
V2_DATESTR VARCHAR(20);
I_YEAR NUMBER; --年
I_MONTH NUMBER; --月
I_DAY NUMBER; --日
D_TJRQ DATE; --日期类型的日期
BEGIN

IF REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, ‘年日*’, ‘’), ‘[[:punct:]]*’, ‘’) IS NULL
THEN
RETURN 0;
END IF;

– 判断日期由数字组成
IF REGEXP_SUBSTR(TRIM(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, ‘年日*’, ‘’), ‘[[:punct:]]*’, ‘’)), ‘[[:digit:]]+’) IS NULL
THEN
RETURN 0;
END IF;

IF LENGTH(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, ‘年日*’, ‘’), ‘[[:punct:]]’, ‘’), ’ ', ‘’)) > 8
OR
LENGTH(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘’), ‘[[:punct:]]*’, ‘’), ’ ', ‘’)) < 6
THEN
RETURN 0;

ELSIF LENGTH(TRIM(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, ‘年日*’, ‘’), ‘[[:punct:]]’, ‘’))) = 6
THEN
V2_DATESTR := SUBSTR(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘’), ‘[[:punct:]]’, ‘’), ’ ', ‘’), 1, 4) || ‘0’ ||
SUBSTR(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘’), ‘[[:punct:]]’, ‘’), ’ ', ‘’), 5, 1) || ‘0’ ||
SUBSTR(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘’), ‘[[:punct:]]*’, ‘’), ’ ', ‘’), 6, 1);

ELSIF LENGTH(TRIM(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, ‘年日*’, ‘’), ‘[[:punct:]]’, ‘’))) = 8
THEN
V2_DATESTR := RTRIM(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘’), ‘[[:punct:]]*’, ‘’));

ELSIF LENGTH(TRIM(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, ‘年日*’, ‘’), ‘[[:punct:]]’, ‘’))) = 7
AND
INSTR(TRIM(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘-’), ‘[[:punct:]]’, ‘-’)), ‘-’, 2) -
INSTR(TRIM(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘-’), ‘[[:punct:]]’, ‘-’)), ‘-’, 1) = 1
THEN
V2_DATESTR := SUBSTR(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘’), ‘[[:punct:]]’, ‘’), ’ ', ‘’), 1, 4) || ‘0’ ||
SUBSTR(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘’), ‘[[:punct:]]’, ‘’), ’ ', ‘’), 5, 1) ||
SUBSTR(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘’), ‘[[:punct:]]’, ‘’), ’ ', ‘’), 6, 2);
ELSIF LENGTH(TRIM(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘’), ‘[[:punct:]]’, ‘’))) = 7
AND
INSTR(TRIM(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘-’), ‘[[:punct:]]’, ‘-’)), ‘-’, 2) -
INSTR(TRIM(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘-’), ‘[[:punct:]]’, ‘-’)), ‘-’, 1) = 2
THEN
V2_DATESTR := SUBSTR(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘’), ‘[[:punct:]]’, ‘’), ’ ', ‘’), 1, 4) ||
SUBSTR(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘’), ‘[[:punct:]]’, ‘’), ’ ', ‘’), 5, 2) || ‘0’ ||
SUBSTR(REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(V_DATESTR, '年
’, ‘’), ‘[[:punct:]]*’, ‘’), ’ ', ‘’), 6, 1);
END IF;

– 截取出年份
I_YEAR := TO_NUMBER(SUBSTR(V2_DATESTR, 1, 4));

– 截取出月份
I_MONTH := TO_NUMBER(SUBSTR(V2_DATESTR, 5, 2));

– 截取出日期
I_DAY := TO_NUMBER(SUBSTR(V2_DATESTR, 7, 2));

– 对月份进行判断,必须在1月到12月范围之内

IF I_MONTH NOT BETWEEN 1 AND 12
THEN
BEGIN
RETURN 0;
END;
END IF;

– 对日期的判断,1,3,5,7,8,10,12月最大日为31,4,6,9,11月最大日为30,2月若为闰年则为29,其它年则为28.
IF I_DAY BETWEEN 1 AND 31
THEN
BEGIN
IF I_DAY = 31
AND I_MONTH NOT IN (1, 3, 5, 7, 8, 10, 12)
THEN
BEGIN
RETURN 0;
END;
END IF;
IF I_MONTH = 2
THEN
BEGIN
– RULES 1:普通年能被4整除且不能被100整除的为闰年。
– RULES 2:世纪年能被400整除的是闰年。
– RULES 3:对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。如172800年是闰年,86400年不是闰年。
IF ((MOD(I_YEAR, 4) = 0 AND MOD(I_YEAR, 100) <> 0) OR
MOD(I_YEAR, 400) = 0 OR
(MOD(I_YEAR, 3200) = 0 AND MOD(I_YEAR, 172800) = 0))
THEN
BEGIN
–若为闰年,则2月份最大日为29
IF I_DAY > 29
THEN
BEGIN
RETURN 0;
END;
END IF;
END;
ELSE
BEGIN
–若不为闰年,则2月份最大日为28
IF I_DAY > 28
THEN
BEGIN
RETURN 0;
END;
END IF;
END;
END IF;
END;
END IF;
RETURN 1;
END;
ELSE
RETURN 0;
END IF;
END;

### 如何使用 `DataValidationConstraint` 进行日期格式校验 在 Java 中,Apache POI 提供了强大的工具来创建 Excel 文件并对其进行复杂的校验操作。其中,`DataValidationConstraint` 是用于定义数据验证约束的核心类之一。以下是关于如何利用该类实现日期格式校验的具体方法。 #### 创建日期范围校验 可以使用 `createDateConstraint` 方法来指定允许的日期范围。此方法接受四个数:运算符类型、起始日期字符串、结束日期字符串以及提示消息的语言环境(可选)。下面是一个完整的代码示例: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.ss.util.CellRangeAddressList; public class DateValidationExample { public static void main(String[] args) throws Exception { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Date Validation"); // 定义日期范围 String startDate = "2023-01-01"; String endDate = "2023-12-31"; // 创建 DataValidationHelper 和 DataValidationConstraint DataValidationHelper validationHelper = sheet.getDataValidationHelper(); DataValidationConstraint constraint = validationHelper.createDateConstraint( DataValidationConstraint.OperatorType.BETWEEN, startDate, endDate, null); // 定义应用校验的单元格区域 CellRangeAddressList addressList = new CellRangeAddressList(1, 10, 0, 0); // 创建 DataValidation 对象 DataValidation validation = validationHelper.createValidation(constraint, addressList); // 设置当输不符合条件时的行为 validation.setSuppressDropDownArrow(true); validation.setShowErrorBox(true); validation.setErrorStyle(DataValidation.ErrorStyle.STOP); validation.createErrorBox("Invalid Input", "Please enter a date between " + startDate + " and " + endDate); // 将校验规则添加到工作表中 sheet.addValidationData(validation); // 输出文件 try (FileOutputStream fileOut = new FileOutputStream("date_validation.xlsx")) { workbook.write(fileOut); } workbook.close(); } } ``` 上述代码实现了以下功能[^1]: - 使用 `DataValidationHelper` 来帮助构建数据校验逻辑。 - 调用 `createDateConstraint` 方法设定日期范围为 `"2023-01-01"` 到 `"2023-12-31"`。 - 应用校验规则至 A2:A11 单元格区域。 - 当用户尝试输超出范围的日期时,会弹出错误提示框。 #### 自定义日期格式显示 如果希望在 Excel 表格中自定义日期格式,则可以通过设置单元格样式完成这一需求: ```java CellStyle cellStyle = workbook.createCellStyle(); CreationHelper createHelper = workbook.getCreationHelper(); cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-mm-dd")); Cell cell = row.createCell(columnIndex); cell.setCellValue(new java.sql.Date(System.currentTimeMillis())); cell.setCellStyle(cellStyle); ``` 这段代码设置了单元格内的日期将以 `yyyy-mm-dd` 的形式展示[^3]。 #### 处理多级依赖关系中的非校验 对于更复杂的情况,例如省市区联动时需要确保上级选项已填写才能继续选择下一级别的内容,目前尚无直接内置的方法支持动态检测其他单元格的状态后再决定当前单元格是否有效。不过可通过 VBA 或者外部脚本补充此类功能[^4]。然而,在纯 JAVA 层面生成 EXCEL 文档期间加这种交互式的实时反馈机制较为困难。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值