|
|
@@ -0,0 +1,49 @@
|
|
|
+package com.ruoyi.ems.util;
|
|
|
+
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 日期前缀工具:将年/月/日前缀转换为左闭右开日期区间,替代日期列上的 LIKE 前缀匹配(LIKE 会导致索引失效)
|
|
|
+ *
|
|
|
+ * @author ruoyi
|
|
|
+ */
|
|
|
+public class DateRangeUtils {
|
|
|
+ private static final DateTimeFormatter DATE_FORM = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将日期前缀转换为左闭右开区间 [start, end)
|
|
|
+ *
|
|
|
+ * @param datePrefix 日期前缀,支持 yyyy、yyyy-MM、yyyy-MM-dd
|
|
|
+ * @return 长度为 2 的数组:[0]=起始日期(含)、[1]=结束日期(不含);格式不支持时返回 null
|
|
|
+ */
|
|
|
+ public static String[] toHalfOpenRange(String datePrefix) {
|
|
|
+ if (datePrefix == null || datePrefix.trim().isEmpty()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ String p = datePrefix.trim();
|
|
|
+ try {
|
|
|
+ LocalDate start;
|
|
|
+ LocalDate end;
|
|
|
+ if (p.length() >= 10) {
|
|
|
+ start = LocalDate.parse(p.substring(0, 10), DATE_FORM);
|
|
|
+ end = start.plusDays(1);
|
|
|
+ }
|
|
|
+ else if (p.length() >= 7) {
|
|
|
+ start = LocalDate.parse(p.substring(0, 7) + "-01", DATE_FORM);
|
|
|
+ end = start.plusMonths(1);
|
|
|
+ }
|
|
|
+ else if (p.length() >= 4) {
|
|
|
+ start = LocalDate.parse(p.substring(0, 4) + "-01-01", DATE_FORM);
|
|
|
+ end = start.plusYears(1);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return new String[] { start.format(DATE_FORM), end.format(DATE_FORM) };
|
|
|
+ }
|
|
|
+ catch (Exception e) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|