1. 为什么要写时间变量
项目中经常会用到写时间变量的情况,特别是调度系统中,运维的同学应该深有体会。如定时调度的sql,周期生成的文件等等,其中时间都只能是变量,执行时替换为数据日期。而时间变量不可能只是简单yyyyMMdd就能表示,比如sql的筛选条件是每月倒数第5天的数据,比如月文件数据日期为上月日期等等。而此时就需要一个灵活简便的方式,不但能做变量的替换,还需要按照规则对时间进行加减运算等等操作。
例如:抽取每月1号到倒数第二天的数据,此时sql的时间函数一般都能解决,但写函数的麻烦程度可想而知,而用时间变量就可以很好表示。
select * from bassint.int_10086_$OT_yyyyMM$ where op_time = '$OT_yyyyMMdd(^2d)$';
2. 规则:
1. 定义时间变量前缀、后缀,用以标识前后缀之间的为时间变量。如:
前缀"$OT_"和后缀"$",代表前后缀之间的时间变量为数据时间。而"$CT_"和"$"代表前后缀之间的时间变量为当前时间
$OT_yyyyMMdd$ $CT_yyyyMMdd HH:MM:ss$
2. 定义时间规则前缀、后缀,如前缀"("和后缀")",代表前后缀之间的字符串为时间运算规则
$OT_yyyyMMdd(-1d)$ 数据时间的前一天
$OT_yyyyMMdd HH(+1h)$ 数据时间的后一小时
$OT_yyyyMM(-1m)dd(^1d)$ 数据时间上一月的最后一天
3. 运算规则
时间规则,y(年),m(月),d(天),h(小时24),i(分钟),s(秒)
运算符+ - ^
+ 在原时间上加
- 在原时间上减
^ 当前时间最后前多少时间,即倒数如
^5i 表示当前小时最后前5分钟 55分
^1h 表示当前天最后前1小时 23时
^3m 表示当前年最后前3月 10月
3. 实现代码
由于篇幅有限,这里只提供主要属性和方法声明,具体代码可自行实现。
private String optimePrefix="$OT_";
private String optimeSuffix="$";
private String currTimePrefix="$CT_";
private String currTimeSuffix="$";
private String timeRulePrefix="(";
private String timeRuleSuffix=")";
private static booleanignoreNotFound=false;
/**
*替换字符按串入口方法,获取前后缀之间字符串集合,遍历集合,提取每个时间变量中的时间规则,并进行计算,最后得出计算后的时间
*@param timeStr需要替换的字符串
*@param timeMillis时间
*@param prefix前缀
*@param suffix后缀
*@return
*@throwsException
*/
public String replaceTimeString(String timeStr, longtimeMillis,String prefix,String suffix){...}
/**
*读取字符串中固定前后缀之间的子串
*@param value原字符串
*@param prefix前缀
*@param suffix后缀
*@return提取出的子串Set集合
*/
public Set getStringVars(String value,String prefix,String suffix){...}
/**
*获取单个时间变量,以及其时间规则
*如yyyy(+1y)MM(-1m)dd HH:mm(+30i):ss提取的结果为键值对:("yyyyMMdd HH:mm:ss","+1y,-1m,+30i")
*@param value 时间变量
*@param prefix前缀
*@param suffix后缀
*@returnPair(K, V)即("yyyyMMdd HH:mm:ss","+1y,-1m,+30i")
*@throwsException
*/
public Pair getStringRule(String value,String prefix,String suffix) {...}
/**
*使用paramMap,替换value中对应的K
*@param value需要替换的字符串
*@param prefix替换子串前缀
*@param suffix替换子串后缀
*@param paramMap替换子串的对应关系
*@param ignoreNotFound当paramMap中找到不到对应子串的key时,
* true:忽略错误,返回未替换的字符串
* false:抛出异常
*@param notFoundValue当ignoreNotFound为true时,将paramMap中找到不到对应key的子串替换为notFoundValue
* notFoundValue为null时不做替换
*@return替换后的字符串
*/
public String replaceString(String value,String prefix,String suffix,Map paramMap,
booleanignoreNotFound,String notFoundValue) {...}
/**
*根据时间格式和时间规则,得到运算后的时间。
*@param format时间的格式,如yyyyMMdd
*@param timeRule时间规则
*@param timeMillis时间
*@return
*@throwsException
*/
public String parseTime(String format,String timeRule, longtimeMillis) {...}
/**
*返回按照时间规则运算后的时间
*@param cal输入时间
*@param ruleItem时间规则,y(年),m(月),d(天),h(小时24),i(分钟),s(秒)
*支持+ - ^运算
* +在原时间上加
* -在原时间上减
* ^当前时间最后前多少时间,如
* ^5i表示当前小时最后前5分钟55分
* ^1h表示当前天最后前1小时23时
* ^3m表示当前年最后前3月10月
*
*@throwsException
*/
private Calendar calculateTimeByRuleItem(Calendar cal,String ruleItem) {...}
网友评论