[jOOQ/jOOQ#10153] Datetime arithmetic support

This commit is contained in:
Lukas Eder 2020-05-21 17:39:22 +02:00
parent 351696e42e
commit 3273600a25
4 changed files with 48 additions and 0 deletions

View File

@ -84,6 +84,9 @@ import static org.jooq.impl.Keywords.K_MILLISECOND;
import static org.jooq.impl.Keywords.K_MONTH;
import static org.jooq.impl.Keywords.K_YEAR_MONTH;
import static org.jooq.impl.Keywords.K_YEAR_TO_MONTH;
import static org.jooq.impl.Names.N_ADD_DAYS;
import static org.jooq.impl.Names.N_ADD_MONTHS;
import static org.jooq.impl.Names.N_ADD_SECONDS;
import static org.jooq.impl.Names.N_DATEADD;
import static org.jooq.impl.Names.N_DATE_ADD;
import static org.jooq.impl.Names.N_STRFTIME;
@ -551,6 +554,32 @@ final class Expression<T> extends AbstractField<T> {
@ -604,6 +633,8 @@ final class Expression<T> extends AbstractField<T> {
@ -612,6 +643,7 @@ final class Expression<T> extends AbstractField<T> {
ctx.visit(N_DATEADD).sql('(').visit(K_DAY).sql(", ").visit(rhsAsNumber()).sql(", ").visit(lhs).sql(')');
else
ctx.visit(N_DATEADD).sql('(').visit(K_DAY).sql(", ").visit(rhsAsNumber().neg()).sql(", ").visit(lhs).sql(')');
break;
}
@ -623,6 +655,7 @@ final class Expression<T> extends AbstractField<T> {
ctx.visit(lhs.add(DSL.field("{0} day", rhsAsNumber())));
else
ctx.visit(lhs.sub(DSL.field("{0} day", rhsAsNumber())));
break;
}
@ -655,6 +688,7 @@ final class Expression<T> extends AbstractField<T> {
ctx.visit(N_DATE_ADD).sql('(').visit(lhs).sql(", ").visit(K_INTERVAL).sql(' ').visit(rhsAsNumber()).sql(' ').visit(K_DAY).sql(')');
else
ctx.visit(N_DATE_ADD).sql('(').visit(lhs).sql(", ").visit(K_INTERVAL).sql(' ').visit(rhsAsNumber().neg()).sql(' ').visit(K_DAY).sql(')');
break;
}
@ -677,6 +711,8 @@ final class Expression<T> extends AbstractField<T> {
@ -689,6 +725,7 @@ final class Expression<T> extends AbstractField<T> {
ctx.visit(new DateAdd(lhs, rhsAsNumber(), DatePart.DAY));
else
ctx.visit(new DateAdd(lhs, rhsAsNumber().neg(), DatePart.DAY));
break;
}
@ -697,6 +734,7 @@ final class Expression<T> extends AbstractField<T> {
ctx.visit(N_STRFTIME).sql("('%Y-%m-%d %H:%M:%f', ").visit(lhs).sql(", ").visit(rhsAsNumber().concat(inline(" day"))).sql(')');
else
ctx.visit(N_STRFTIME).sql("('%Y-%m-%d %H:%M:%f', ").visit(lhs).sql(", ").visit(rhsAsNumber().neg().concat(inline(" day"))).sql(')');
break;
@ -710,6 +748,7 @@ final class Expression<T> extends AbstractField<T> {
case H2:
default:
ctx.visit(new DefaultExpression<>(lhs, operator, wrap(rhs)));

View File

@ -53,7 +53,9 @@ final class Names {
static final Name N_COLUMN_VALUE = name("COLUMN_VALUE");
static final Name N_ACOS = unquotedName("acos");
static final Name N_ADD_DAYS = unquotedName("add_days");
static final Name N_ADD_MONTHS = unquotedName("add_months");
static final Name N_ADD_SECONDS = unquotedName("add_seconds");
static final Name N_ARRAY = unquotedName("array");
static final Name N_ARRAY_AGG = unquotedName("array_agg");
static final Name N_ASC = unquotedName("asc");
@ -153,6 +155,7 @@ final class Names {
static final Name N_MID = unquotedName("mid");
static final Name N_MOD = unquotedName("mod");
static final Name N_MODE = unquotedName("mode");
static final Name N_NANO100_BETWEEN = unquotedName("nano100_between");
static final Name N_NEXTVAL = unquotedName("nextval");
static final Name N_NOT = unquotedName("not");
static final Name N_NOW = unquotedName("now");

View File

@ -41,6 +41,7 @@ import static org.jooq.impl.DSL.function;
import static org.jooq.impl.DSL.keyword;
import static org.jooq.impl.Keywords.K_MILLISECOND;
import static org.jooq.impl.Names.N_DATEDIFF;
import static org.jooq.impl.Names.N_NANO100_BETWEEN;
import static org.jooq.impl.Names.N_STRFTIME;
import static org.jooq.impl.Names.N_TIMESTAMPDIFF;
import static org.jooq.impl.SQLDataType.INTEGER;
@ -107,6 +108,10 @@ final class TimestampDiff extends AbstractField<DayToSecond> {

View File

@ -4714,6 +4714,7 @@ final class Tools {
case CUBRID: ctx.sql(' ').visit(K_AUTO_INCREMENT); break;
case DERBY: ctx.sql(' ').visit(K_GENERATED_BY_DEFAULT_AS_IDENTITY); break;
case HSQLDB: ctx.sql(' ').visit(K_GENERATED_BY_DEFAULT_AS_IDENTITY).sql('(').visit(K_START_WITH).sql(" 1)"); break;