package jef.database.query.function; import java.util.List; import jef.database.jsqlparser.expression.Function; import jef.database.jsqlparser.expression.LongValue; import jef.database.jsqlparser.expression.Parenthesis; import jef.database.jsqlparser.expression.StringValue; import jef.database.jsqlparser.expression.operators.arithmetic.Addition; import jef.database.jsqlparser.expression.operators.arithmetic.Division; import jef.database.jsqlparser.expression.operators.arithmetic.Multiplication; import jef.database.jsqlparser.visitor.Expression; /** * Oracle驱动并没有实现JDBC函数 timestampadd和timestampdiff,因此需要人工模拟。 * 这个类用oracle运算和函数来模拟timestampadd操作 * @author jiyi * */ public class EmuOracleTimestampAdd extends BaseArgumentSqlFunction{ public String getName() { return "timestampadd"; } public Expression renderExpression(List<Expression> arguments) { //第一个参数为COlumn表示单位 //第二个参数为偏差 //第三个参数为时间 String unit=arguments.get(0).toString().toLowerCase(); if(unit.startsWith("sql_tsi_")){ unit=unit.substring(8); } Expression adjust=arguments.get(1); Expression timeValue=arguments.get(2); if(timeValue instanceof StringValue){ timeValue=EmuOracleToDate.getInstance().convert((StringValue)timeValue); } Expression result; if("day".equals(unit)){ result=new Addition(timeValue, adjust); }else if("hour".equals(unit)){ adjust=new Division(adjust,new LongValue(24)); adjust=new Parenthesis(adjust); result=new Addition(timeValue, adjust); }else if("minute".equals(unit)){ adjust=new Division(adjust,new LongValue(1440)); adjust=new Parenthesis(adjust); result=new Addition(timeValue, adjust); }else if("second".equals(unit)){ adjust=new Division(adjust,new LongValue(86400)); adjust=new Parenthesis(adjust); result=new Addition(timeValue, adjust); }else if("month".equals(unit)){ result=new Function("add_months",timeValue,adjust); }else if("quarter".equals(unit)){ Expression right=new Multiplication(adjust,new LongValue(3)); result=new Function("add_months",timeValue,right); }else if("year".equals(unit)){ Expression right=new Multiplication(adjust,new LongValue(12)); result=new Function("add_months",timeValue,right); }else{ throw new UnsupportedOperationException("The Oracle Dialect can't handle datetime unit ["+unit+"] for now."); } return result; } }