1. 程式人生 > >sql中時間巨集替換

sql中時間巨集替換

之前做了一個sql任務排程平臺,sql根據配置的cron表示式執行;排程平臺需要靈活的根據當前時間去計算並替換sql中特殊的時間巨集;舉個例子

select * from order a join order order_item b on a.id=b.order_id and a.day = ${date-1,yyyyMMdd} 
  and b.day=${date- 1,yyyyMMdd} and a.signed_time>${date-2}

如果今天是20181119,那排程平臺執行的sql就需要替換${date-1,yyyyMMdd}${date-2},替換後如下

select * from order a join order order_item b on a.id=b.order_id and a.day = 20181118 and b.day=20181118 
 and a.signed_time>1542463989123

程式碼也很簡單

public class Test{

    public static void main(String[] args) {
        String sql = "select * from order a join order order_item b on a.id=b.order_id and a.day = ${date-1,yyyyMMdd} " +
                "and b.day=${date- 1,yyyyMMdd} and a.signed_time>${date-2}";
        String pattern = "\\$\\{(.*?)\\}";
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(sql);
        Set<String> dates = new HashSet<String>();

        while(m.find()){
            dates.add(m.group(1));
        }

        System.out.println("需要格式化的時間串:"+dates);
        for(String s:dates){
            String st = "\\$\\{"+s+"\\}";
            sql = sql.replaceAll(st,date_str(s));
//            System.out.println(line.replaceAll("\\$\\{date-1,yyyyMMdd\\}","20181109"));
        }
        
        System.out.println(sql);
        System.out.println(date_str("date-1,yyyyMMdd"));
        System.out.println(date_str("date-1"));
        System.out.println(date_str("date-1,yyyyMMddmmSS"));

    }

    public static String date_str(String str){
        String[] arr = str.replaceAll(" +","").split(",");
        Calendar cal = Calendar.getInstance();
        int interval = Integer.parseInt(arr[0].replaceAll("date",""));
        cal.add(Calendar.DATE,interval);
        DateFormat df = null;
        if(arr.length==1){
            return cal.getTime().getTime()+"";
        }else if(arr.length==2){
            df = new SimpleDateFormat(arr[1]);
        }else{
            throw new  RuntimeException("date error:"+str);
        }
        return df.format(cal.getTime());
    }
}

輸出如下

需要格式化的時間串:[date-2, date- 1,yyyyMMdd, date-1,yyyyMMdd]
select * from order a join order order_item b on a.id=b.order_id and a.day = 20181118 and b.day=20181118 and a.signed_time>1542463989123
20181118
1542550389166
2018111813166

end