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.Division; import jef.database.jsqlparser.expression.operators.arithmetic.Multiplication; import jef.database.jsqlparser.expression.operators.arithmetic.Subtraction; import jef.database.jsqlparser.visitor.Expression; /** * Oracle驱动并没有实现JDBC函数 timestampadd和timestampdiff,因此需要人工模拟。 * 这个类用oracle运算和函数来模拟timestampdiff操作 * @author jiyi * */ public class EmuOracleTimeStampDiff extends BaseArgumentSqlFunction{ public String getName() { return "timestampdiff"; } public Expression renderExpression(List<Expression> arguments) { Expression arg1=arguments.get(1); if(arg1 instanceof StringValue){ arg1=EmuOracleToDate.getInstance().convert((StringValue)arg1); } Expression arg2=arguments.get(2); if(arg2 instanceof StringValue){ arg2=EmuOracleToDate.getInstance().convert((StringValue)arg2); } String unit=arguments.get(0).toString().toLowerCase(); if(unit.startsWith("sql_tsi_")){ unit=unit.substring(8); } Expression subtraction; if("day".equals(unit)){ subtraction=new Subtraction(arg2,arg1); }else if("hour".equals(unit)){ subtraction=new Subtraction(arg2,arg1); subtraction=new Multiplication(new Parenthesis(subtraction),new LongValue(24)); }else if("minute".equals(unit)){ subtraction=new Subtraction(arg2,arg1); subtraction=new Multiplication(new Parenthesis(subtraction),new LongValue(1440)); }else if("second".equals(unit)){ subtraction=new Subtraction(arg2,arg1); subtraction=new Multiplication(new Parenthesis(subtraction),new LongValue(86400)); }else if("month".equals(unit)){ subtraction=new Function("months_between",arg2,arg1); }else if("quarter".equals(unit)){ subtraction=new Function("months_between",arg2,arg1); subtraction=new Division(subtraction,new LongValue(3)); }else if("year".equals(unit)){ subtraction=new Function("months_between",arg2,arg1); subtraction=new Division(subtraction,new LongValue(12)); }else{ throw new UnsupportedOperationException("The Oracle Dialect can't handle datetime unit ["+unit+"] for now."); } return new Function("trunc",subtraction); } }