今天就跟大家聊聊有关datax-web ExecutorJobHandler如何修改源码解决sqlserver时间格式不识别时间字符串中的%,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
创新互联成立于2013年,先为路北等服务建站,路北等地企业,进行企业商务咨询服务。为路北企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
select * from dbo.SKJJGWFGXX where (i_time >= '1980-01-01%00:00:00' and i_time < '2020-12-15%15:25:40') 具体错误信息为:com.microsoft.sqlserver.jdbc.SQLServerException: 从字符串转换日期和/或时间时,转换失败。
时间字符串中带%,MySQL数据库能识别并正确执行,而sqlserver数据库(2008)不能识别,造成查询失败。
如果此问题不解决,那么从sqlserver到mysql的数据同步中,无法采用时间增量方式进行数据实时同步。
在java中和python中都尝试把“%”换成空格,最后的结果都是无法运行。估计是在命令行中做为参数传入时,空格本身是特殊符号,用于分开命令和参数的,强行替换,最后导致时间字符串被分成两段接收。
修改ExecutorJobHandler,生成job临时文件时,把临时文件中的变量用具体值进行替换。
定义了一个新的处理方法:replaceJobJsonParams
// zhuangxl 2020.12.15 替换开始
String jobJson = new String(trigger.getJobJson());
jobJson = replaceJobJsonParams(jobJson, trigger);
tmpFilePath = generateTemJsonFile(jobJson);
// zhuangxl 2020.12.15 替换结束
/**
* 替换job文件参数
* @author zhuangxl
* @param jobJson
* @return
*/
private String replaceJobJsonParams(String jobJson, TriggerParam trigger) {
if (IncrementTypeEnum.TIME.getCode() == trigger.getIncrementType()) {
String replaceParamType = trigger.getReplaceParamType();
//类别:时间自增,只操作指定了具体的时间格式的类型
if (StringUtils.isNotBlank(replaceParamType) && !replaceParamType.equals("Timestamp")) {
//格式化时间字符串
SimpleDateFormat sdf = new SimpleDateFormat(replaceParamType);
String endTime_ = sdf.format(trigger.getTriggerTime());
String startTime_ = sdf.format(trigger.getStartTime());
//识别要替换的时间变量名称
String[] replaceParams = trigger.getReplaceParam().split(" ");
String startTimeStr = replaceParams[0].substring(replaceParams[0].indexOf("D")+1, replaceParams[0].indexOf("="));
String endTimeStr = replaceParams[1].substring(replaceParams[1].indexOf("D")+1, replaceParams[1].indexOf("="));
//执行变量替换
jobJson = jobJson.replace("${"+startTimeStr+"}", "'"+startTime_+"'");
jobJson = jobJson.replace("${"+endTimeStr+"}", "'"+endTime_+"'");
}
}
return jobJson;
}
看完上述内容,你们对datax-web ExecutorJobHandler如何修改源码解决sqlserver时间格式不识别时间字符串中的%有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。