取得年月日小时分秒+多位流水号的序列号

本文介绍了一种生成唯一序列号(受理号)的方法,通过组合当前的年月日、小时分秒与递增的流水号,确保每个生成的序列号在全球范围内具有唯一性。

static long m_sysno = 1;
// 取得日期
   private static String getDate() {
         String result = null;
         Date date = new Date();
         DateFormat format;
         format = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.CHINA);
         result = format.format(date);
         int head=result.indexOf("-");
         int end =result.lastIndexOf("-");
         String y = result.substring(0,head);
         String m= result.substring(head+1,end);
         String d = result.substring(end+1);
         if(m.length()==1) m = "0"+m;
         if(d.length()==1) d = "0"+d;
         result = y+m+d;
         return result;
     }
// 取得小时分秒
     private static String getTime() {
         String result = null;
         Date date = new Date();
         DateFormat format;
         format = DateFormat.getTimeInstance(DateFormat.MEDIUM,Locale.CHINA);
         result = format.format(date);
         int head = result.indexOf(":");
         int end = result.lastIndexOf(":");
         String hh = result.substring(0,head);
         String mm = result.substring(head+1,end);
         String ss = result.substring(end+1);
         if(hh.length()==1) hh = "0" + hh;
         if(mm.length()==1) mm = "0" + mm;
         if(ss.length()==1) ss = "0" + ss;
         result = hh + mm + ss;
         return result;
     }
// 取得流水号(受理号)
     private static String getNumber(long n) {
         String result = null;
         NumberFormat format = NumberFormat.getNumberInstance();
         format.setMinimumIntegerDigits(6);
         String nf = format.format(n);
         result = nf.substring(0,3);
         return result;
     }
//取得序列号,年月日小时分秒+6位流水号
     private static String getNo(long sysno)
     {
          String result = null;
          result = getDate()+ getTime() + getNumber(sysno);
          m_sysno = m_sysno+1;
          return result;
     } 

 

 

注意,其中相关知识:

str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str;

str=str.substring(int beginIndex,int endIndex);截取str中从beginIndex开始至endIndex结束时的字符串,并将其赋值给str;

 

有关numberformat
如果您来自美国,您会在较大的数值中间放置逗号来表示千和百万(等等,每三个数值使用一个逗号)。对于浮点数,您将在整数部分和小数部分之间放置小数点。对于金钱,货币符号 $ 放在金额的前面。如果 您从来没有到过美国以外的地方,可能就不会关心用英镑(£)来格式化的英国货币,或者用欧元(?)来表示的其他欧洲国家的货币。
对于那些我们确实关心的货币,我们可以使用 NumberFormat 及其相关的类来格式化它们。开发人员使用 NumberFormat 类来读取用户输入的数值,并格式化将要显示给用户看的输出。
在Java的I/O里,并没有所谓的型别,不管是int、long、double…最後都是以String输出,所以如果要让数字以特定格式输出,需透过Java提供的两个类别java.text.NumberFormat和java.text.DecimalFormat将数字格式化後再输出。
在开始使用NumberFormat时,应先用getInstance取得NumberFormat的实体,范例12中的setMaximumIntegerDigits和setMinimumFractionDigits是用来设定整数和小数的位数,另外还有setMinimumIntegerDigits和setMaximumFractionDigits也是同样功能。这些设定如有冲突,Java以最後设定的为准。


import java.text.*;
public class myFormat {
    public myFormat() {
        NumberFormat nf = NumberFormat.getInstance();
        double dblNum = Math.PI;
        System.out.println(dblNum);
        nf.setMaximumIntegerDigits(5);
        nf.setMinimumFractionDigits(4);
        System.out.println("PI: " + nf.format(dblNum));
  }

  public static void main(String[] args) {
      myFormat myFormat1 = new myFormat();
  }

}

 

或者你觉得上面的方法不好用,不要格式化,那么可以用以下方法代替getNumber方法:

private static String getNumber(long n) {
         String result = "";
         String nf = String.valueOf(n);
         int len = nf.length();
         if ((6-len)>0){
            for (int i=0;i<(6-len);i++){
             result +="0";
            }
         }
         result = result+nf;
         //System.out.println(result);
         return result;
     }

这样你要多少流水号就设定成多少就行了。

根据您的数据格式 `QT+YYYYMMDD+3流水号`,以下是针对性优化方案: --- ### **1. 最优索引方案** #### **创建前缀索引(最推荐)** ```sql ALTER TABLE t_lc94_ext ADD INDEX idx_fld_prefix (FLD_T_00288(10)); -- 只索引前10(QT+年月日),兼顾索引效率与查询性能 ``` #### **查询写法** ```sql SELECT FLD_T_00288 FROM t_lc94_ext WHERE FLD_T_00288 LIKE CONCAT('QT', #{dateStr}, '%') -- 固定前缀+日期 /* 可选:精确长度过滤(总长度=2+8+3=13) */ AND LENGTH(FLD_T_00288) = 13; ``` **优势**: - 精确利用前缀索引(`QT20240517`走索引) - 扫描范围缩小到特定日期的记录 --- ### **2. 按日期范围查询优化** #### **日期提取方案(无需修改数据)** ```sql SELECT FLD_T_00288 FROM t_lc94_ext WHERE SUBSTRING(FLD_T_00288, 3, 8) = #{dateStr} -- 提取YYYYMMDD部分 /* 支持索引的方案(MySQL 8.0+) */ -- AND FLD_T_00288 LIKE 'QT%' -- 辅助条件 ``` #### **函数索引方案(需数据库支持)** ```sql -- MySQL 8.0+ 函数索引 ALTER TABLE t_lc94_ext ADD INDEX idx_date_part ((SUBSTRING(FLD_T_00288, 3, 8))); -- PostgreSQL 表达式索引 CREATE INDEX idx_date_part ON t_lc94_ext (SUBSTRING(FLD_T_00288 FROM 3 FOR 8)); ``` --- ### **3. 流水号范围查询** #### **查询某日所有流水号** ```sql SELECT FLD_T_00288 FROM t_lc94_ext WHERE FLD_T_00288 BETWEEN CONCAT('QT', #{dateStr}, '001') AND CONCAT('QT', #{dateStr}, '999'); ``` **执行计划**: - 走`idx_fld_prefix`索引 - 扫描行数≈当日记录数(最优) --- ### **4. 数据验证与示例** #### **验证数据格式** ```sql -- 检查不符合规则的数据 SELECT FLD_T_00288 FROM t_lc94_ext WHERE FLD_T_00288 NOT REGEXP '^QT[0-9]{8}[0-9]{3}$'; ``` #### **典型查询场景** | 查询需求 | SQL示例 | 是否走索引 | |----------|---------|------------| | 查某日所有记录 | `LIKE 'QT20240517%'` | ✅ | | 查某条具体编号 | `= 'QT20240517001'` | ✅ | | 查某月所有记录 | `SUBSTRING(FLD,3,6) = '202405'` | 需函数索引 | --- ### **5. 性能对比测试** ```sql -- 测试用例(MySQL) EXPLAIN SELECT FLD_T_00288 FROM t_lc94_ext WHERE FLD_T_00288 LIKE 'QT20240517%'; -- 对比全模糊查询 EXPLAIN SELECT FLD_T_00288 FROM t_lc94_ext WHERE FLD_T_00288 LIKE '%20240517%'; ``` **预期结果**: - 前缀查询:`type=range`, `key=idx_fld_prefix`, `rows=几十` - 全模糊查询:`type=ALL`, `rows=全表` --- ### **6. 维护建议** 1. **定期重建索引**: ```sql ALTER TABLE t_lc94_ext ENGINE=InnoDB; -- MySQL优化 REINDEX TABLE t_lc94_ext; -- PostgreSQL ``` 2. **数据归档**: ```sql -- 将历史数据移动到归档表 INSERT INTO t_lc94_ext_archive SELECT * FROM t_lc94_ext WHERE SUBSTRING(FLD_T_00288, 3, 8) < '20230101'; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值