[jOOQ/jOOQ#2132] [jOOQ/jOOQ#10153] Support more EXTRACT() date parts

This commit is contained in:
Lukas Eder 2020-05-21 15:49:52 +02:00
parent f6c5ed5461
commit 351696e42e
4 changed files with 46 additions and 7 deletions

View File

@ -37,7 +37,6 @@
*/
package org.jooq;
// ...
// ...
// ...
import static org.jooq.SQLDialect.POSTGRES;

View File

@ -44,6 +44,7 @@ package org.jooq;
// ...
// ...
import static org.jooq.SQLDialect.H2;
// ...
import static org.jooq.SQLDialect.HSQLDB;
import static org.jooq.SQLDialect.MARIADB;
// ...
@ -210,10 +211,12 @@ public enum DatePart {
private final String sql;
private final Keyword keyword;
private final Name name;
private DatePart(String sql) {
this.sql = sql;
this.keyword = DSL.keyword(sql);
this.name = DSL.unquotedName(sql);
}
public final String toSQL() {
@ -223,4 +226,8 @@ public enum DatePart {
public final Keyword toKeyword() {
return keyword;
}
public final Name toName() {
return name;
}
}

View File

@ -40,6 +40,7 @@ package org.jooq.impl;
import static org.jooq.impl.DSL.function;
import static org.jooq.impl.DSL.inline;
import static org.jooq.impl.DSL.isoDayOfWeek;
import static org.jooq.impl.DSL.keyword;
import static org.jooq.impl.DSL.one;
import static org.jooq.impl.Keywords.K_DATE;
@ -54,11 +55,14 @@ import static org.jooq.impl.Keywords.K_YEAR;
import static org.jooq.impl.Names.N_DATEDIFF;
import static org.jooq.impl.Names.N_DATEPART;
import static org.jooq.impl.Names.N_DAYOFWEEK;
import static org.jooq.impl.Names.N_DAYOFYEAR;
import static org.jooq.impl.Names.N_EXTRACT;
import static org.jooq.impl.Names.N_SECONDS_BETWEEN;
import static org.jooq.impl.Names.N_STRFTIME;
import static org.jooq.impl.Names.N_TO_CHAR;
import static org.jooq.impl.Names.N_TO_NUMBER;
import static org.jooq.impl.Names.N_TRUNC;
import static org.jooq.impl.Names.N_WEEKDAY;
import static org.jooq.impl.SQLDataType.INTEGER;
import static org.jooq.impl.SQLDataType.VARCHAR;
import static org.jooq.impl.Tools.castIfNeeded;
@ -272,6 +276,31 @@ final class Extract extends AbstractField<Integer> {
@ -300,16 +329,16 @@ final class Extract extends AbstractField<Integer> {
ctx.visit(N_DAYOFWEEK).sql('(').visit(field).sql(')');
return;
case DAY_OF_YEAR:
ctx.visit(keyword("dayofyear")).sql('(').visit(field).sql(')');
ctx.visit(N_DAYOFYEAR).sql('(').visit(field).sql(')');
return;
case EPOCH:
ctx.visit(keyword("unix_timestamp")).sql('(').visit(field).sql(')');
return;
case ISO_DAY_OF_WEEK:
ctx.visit(keyword("weekday")).sql('(').visit(field).sql(") + 1");
ctx.visit(N_WEEKDAY).sql('(').visit(field).sql(") + 1");
return;
case QUARTER:
ctx.visit(datePart.toKeyword()).sql('(').visit(field).sql(')');
ctx.visit(datePart.toName()).sql('(').visit(field).sql(')');
return;
}
break;
@ -365,7 +394,7 @@ final class Extract extends AbstractField<Integer> {
return;
case QUARTER:
case WEEK:
ctx.visit(datePart.toKeyword()).sql('(').visit(field).sql(')');
ctx.visit(datePart.toName()).sql('(').visit(field).sql(')');
return;
}
break;
@ -373,7 +402,7 @@ final class Extract extends AbstractField<Integer> {
case H2:
switch (datePart) {
case QUARTER:
ctx.visit(datePart.toKeyword()).sql('(').visit(field).sql(')');
ctx.visit(datePart.toName()).sql('(').visit(field).sql(')');
return;
case WEEK:
ctx.visit(keyword("iso_week")).sql('(').visit(field).sql(')');
@ -415,7 +444,7 @@ final class Extract extends AbstractField<Integer> {
.div(inline(1000)), INTEGER));
break;
case QUARTER:
ctx.visit(DSL.month(field).add(inline(2)).div(inline(3)));
ctx.visit(DSL.floor(DSL.month(field).add(inline(2)).div(inline(3))));
break;
case TIMEZONE:
ctx.visit(DSL.extract(field, DatePart.TIMEZONE_HOUR).mul(inline(3600))

View File

@ -95,6 +95,7 @@ final class Names {
static final Name N_DATEDIFF = unquotedName("datediff");
static final Name N_DATEPART = unquotedName("datepart");
static final Name N_DAYOFWEEK = unquotedName("dayofweek");
static final Name N_DAYOFYEAR = unquotedName("dayofyear");
static final Name N_DAYS_BETWEEN = unquotedName("days_between");
static final Name N_DECODE = unquotedName("decode");
static final Name N_DEGREES = unquotedName("degrees");
@ -116,6 +117,7 @@ final class Names {
static final Name N_IIF = unquotedName("iif");
static final Name N_INSERT = unquotedName("insert");
static final Name N_INSTR = unquotedName("instr");
static final Name N_ISOWEEK = unquotedName("isoweek");
static final Name N_JOIN = unquotedName("join");
static final Name N_JSON_AGG = unquotedName("json_agg");
static final Name N_JSON_ARRAY = unquotedName("json_array");
@ -191,6 +193,7 @@ final class Names {
static final Name N_RPAD = unquotedName("rpad");
static final Name N_RTRIM = unquotedName("rtrim");
static final Name N_SCHEMA_NAME = unquotedName("schema_name");
static final Name N_SECONDS_BETWEEN = unquotedName("seconds_between");
static final Name N_SELECT = unquotedName("select");
static final Name N_SGN = unquotedName("sgn");
static final Name N_SIGN = unquotedName("sign");
@ -225,6 +228,7 @@ final class Names {
static final Name N_UPPER = unquotedName("upper");
static final Name N_USER = unquotedName("user");
static final Name N_VALUES = unquotedName("values");
static final Name N_WEEKDAY = unquotedName("weekday");
static final Name N_WIDTH_BUCKET = unquotedName("width_bucket");
static final Name N_XMLAGG = unquotedName("xmlagg");
static final Name N_XMLATTRIBUTES = unquotedName("xmlattributes");