sql中時間巨集替換
阿新 • • 發佈:2019-01-02
之前做了一個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