Merge pull request #6215 from bitbrain/master
Add localDateAdd() localDateSub(), localDateDiff() support to DSL
This commit is contained in:
commit
4360d7c29d
@ -12690,6 +12690,152 @@ public class DSL {
|
||||
return new DateOrTime<LocalDate>(field, SQLDataType.LOCALDATE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the date difference in number of days.
|
||||
*
|
||||
* @see Field#sub(Field)
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<Integer> localDateDiff(LocalDate date1, LocalDate date2) {
|
||||
return localDateDiff(Tools.field(date1), Tools.field(date2));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the date difference in number of days.
|
||||
*
|
||||
* @see Field#sub(Field)
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<Integer> localDateDiff(Field<LocalDate> date1, LocalDate date2) {
|
||||
return localDateDiff(nullSafe(date1), Tools.field(date2));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the date difference in number of days.
|
||||
*
|
||||
* @see Field#sub(Field)
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<Integer> localDateDiff(LocalDate date1, Field<LocalDate> date2) {
|
||||
return localDateDiff(Tools.field(date1), nullSafe(date2));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the date difference in number of days.
|
||||
*
|
||||
* @see Field#sub(Field)
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<Integer> localDateDiff(Field<LocalDate> date1, Field<LocalDate> date2) {
|
||||
return new LocalDateDiff(nullSafe(date1), nullSafe(date2));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an interval to a {@link LocalDate}.
|
||||
*
|
||||
* @see Field#add(Number)
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<LocalDate> localDateAdd(LocalDate date, Number interval) {
|
||||
return localDateAdd(Tools.field(date), Tools.field(interval));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an interval to a {@link LocalDate}.
|
||||
*
|
||||
* @see Field#add(Field)
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<LocalDate> localDateAdd(Field<LocalDate> date, Field<? extends Number> interval) {
|
||||
return nullSafe(date).add(interval);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an interval to {@link LocalDate}, given a date part.
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<LocalDate> localDateAdd(LocalDate date, Number interval, DatePart datePart) {
|
||||
return localDateAdd(Tools.field(date), Tools.field(interval), datePart);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an interval to a {@link LocalDate}, given a date part.
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<LocalDate> localDateAdd(LocalDate date, Field<? extends Number> interval, DatePart datePart) {
|
||||
return localDateAdd(Tools.field(date), nullSafe(interval), datePart);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an interval to a {@link LocalDate}, given a date part.
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<LocalDate> localDateAdd(Field<LocalDate> date, Number interval, DatePart datePart) {
|
||||
return localDateAdd(nullSafe(date), Tools.field(interval), datePart);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an interval to a {@link LocalDate}, given a date part.
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<LocalDate> localDateAdd(Field<LocalDate> date, Field<? extends Number> interval,
|
||||
DatePart datePart) {
|
||||
return new LocalDateAdd(nullSafe(date), nullSafe(interval), datePart);
|
||||
}
|
||||
|
||||
/**
|
||||
* Subtract an interval from a {@link LocalDate}.
|
||||
*
|
||||
* @see Field#add(Number)
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<LocalDate> localDateSub(LocalDate date, Number interval) {
|
||||
return localDateSub(Tools.field(date), Tools.field(interval));
|
||||
}
|
||||
|
||||
/**
|
||||
* Subtract an interval from a {@link LocalDate}.
|
||||
*
|
||||
* @see Field#add(Field)
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<LocalDate> localDateSub(Field<LocalDate> date, Field<? extends Number> interval) {
|
||||
return nullSafe(date).sub(interval);
|
||||
}
|
||||
|
||||
/**
|
||||
* Subtract an interval from a {@link LocalDate}, given a date part.
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<LocalDate> localDateSub(LocalDate date, Number interval, DatePart datePart) {
|
||||
return localDateSub(Tools.field(date), Tools.field(interval), datePart);
|
||||
}
|
||||
|
||||
/**
|
||||
* Subtract an interval from a {@link LocalDate}, given a date part.
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<LocalDate> localDateSub(LocalDate date, Field<? extends Number> interval, DatePart datePart) {
|
||||
return localDateSub(Tools.field(date), nullSafe(interval), datePart);
|
||||
}
|
||||
|
||||
/**
|
||||
* Subtract an interval from a {@link LocalDate}, given a date part.
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<LocalDate> localDateSub(Field<LocalDate> date, Number interval, DatePart datePart) {
|
||||
return localDateSub(nullSafe(date), Tools.field(interval), datePart);
|
||||
}
|
||||
|
||||
/**
|
||||
* Subtract an interval from a {@link LocalDate}, given a date part.
|
||||
*/
|
||||
@Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE })
|
||||
public static Field<LocalDate> localDateSub(Field<LocalDate> date, Field<? extends Number> interval,
|
||||
DatePart datePart) {
|
||||
return new LocalDateAdd(nullSafe(date), nullSafe(interval).neg(), datePart);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a string value to a <code>TIME</code>.
|
||||
*/
|
||||
|
||||
214
jOOQ/src/main/java/org/jooq/impl/LocalDateAdd.java
Normal file
214
jOOQ/src/main/java/org/jooq/impl/LocalDateAdd.java
Normal file
@ -0,0 +1,214 @@
|
||||
package org.jooq.impl;
|
||||
|
||||
import static org.jooq.impl.DSL.inline;
|
||||
import static org.jooq.impl.DSL.keyword;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import org.jooq.Configuration;
|
||||
import org.jooq.DatePart;
|
||||
import org.jooq.Field;
|
||||
import org.jooq.QueryPart;
|
||||
|
||||
/**
|
||||
* @author Miguel Gonzalez Sanchez
|
||||
*/
|
||||
final class LocalDateAdd extends AbstractFunction<LocalDate> {
|
||||
|
||||
/**
|
||||
* Generated UID
|
||||
*/
|
||||
private static final long serialVersionUID = -7700140530346259350L;
|
||||
|
||||
private final Field<LocalDate> date;
|
||||
private final Field<? extends Number> interval;
|
||||
private final DatePart datePart;
|
||||
|
||||
LocalDateAdd(Field<LocalDate> date, Field<? extends Number> interval, DatePart datePart) {
|
||||
super("localDateAdd", date.getDataType().getSQLDataType());
|
||||
|
||||
this.date = date;
|
||||
this.interval = interval;
|
||||
this.datePart = datePart;
|
||||
}
|
||||
|
||||
@SuppressWarnings("incomplete-switch")
|
||||
@Override
|
||||
final QueryPart getFunction0(Configuration configuration) {
|
||||
String keyword = null;
|
||||
|
||||
switch (configuration.family()) {
|
||||
case CUBRID:
|
||||
case MARIADB:
|
||||
case MYSQL: {
|
||||
switch (datePart) {
|
||||
case YEAR:
|
||||
keyword = "year";
|
||||
break;
|
||||
case MONTH:
|
||||
keyword = "month";
|
||||
break;
|
||||
case DAY:
|
||||
keyword = "day";
|
||||
break;
|
||||
case HOUR:
|
||||
keyword = "hour";
|
||||
break;
|
||||
case MINUTE:
|
||||
keyword = "minute";
|
||||
break;
|
||||
case SECOND:
|
||||
keyword = "second";
|
||||
break;
|
||||
default:
|
||||
throwUnsupported();
|
||||
}
|
||||
|
||||
return DSL.field("{date_add}({0}, {interval} {1} {2})", getDataType(), date, interval, keyword(keyword));
|
||||
}
|
||||
|
||||
case DERBY:
|
||||
case HSQLDB: {
|
||||
switch (datePart) {
|
||||
case YEAR:
|
||||
keyword = "sql_tsi_year";
|
||||
break;
|
||||
case MONTH:
|
||||
keyword = "sql_tsi_month";
|
||||
break;
|
||||
case DAY:
|
||||
keyword = "sql_tsi_day";
|
||||
break;
|
||||
case HOUR:
|
||||
keyword = "sql_tsi_hour";
|
||||
break;
|
||||
case MINUTE:
|
||||
keyword = "sql_tsi_minute";
|
||||
break;
|
||||
case SECOND:
|
||||
keyword = "sql_tsi_second";
|
||||
break;
|
||||
default:
|
||||
throwUnsupported();
|
||||
}
|
||||
|
||||
return DSL.field("{fn {timestampadd}({0}, {1}, {2}) }", getDataType(), keyword(keyword), interval, date);
|
||||
}
|
||||
|
||||
case FIREBIRD: {
|
||||
switch (datePart) {
|
||||
case YEAR:
|
||||
keyword = "year";
|
||||
break;
|
||||
case MONTH:
|
||||
keyword = "month";
|
||||
break;
|
||||
case DAY:
|
||||
keyword = "day";
|
||||
break;
|
||||
case HOUR:
|
||||
keyword = "hour";
|
||||
break;
|
||||
case MINUTE:
|
||||
keyword = "minute";
|
||||
break;
|
||||
case SECOND:
|
||||
keyword = "second";
|
||||
break;
|
||||
default:
|
||||
throwUnsupported();
|
||||
}
|
||||
|
||||
return DSL.field("{dateadd}({0}, {1}, {2})", getDataType(), keyword(keyword), interval, date);
|
||||
}
|
||||
|
||||
case H2: {
|
||||
switch (datePart) {
|
||||
case YEAR:
|
||||
keyword = "year";
|
||||
break;
|
||||
case MONTH:
|
||||
keyword = "month";
|
||||
break;
|
||||
case DAY:
|
||||
keyword = "day";
|
||||
break;
|
||||
case HOUR:
|
||||
keyword = "hour";
|
||||
break;
|
||||
case MINUTE:
|
||||
keyword = "minute";
|
||||
break;
|
||||
case SECOND:
|
||||
keyword = "second";
|
||||
break;
|
||||
default:
|
||||
throwUnsupported();
|
||||
}
|
||||
|
||||
return DSL.field("{dateadd}({0}, {1}, {2})", getDataType(), inline(keyword), interval, date);
|
||||
}
|
||||
|
||||
case POSTGRES: {
|
||||
switch (datePart) {
|
||||
case YEAR:
|
||||
keyword = " year";
|
||||
break;
|
||||
case MONTH:
|
||||
keyword = " month";
|
||||
break;
|
||||
case DAY:
|
||||
keyword = " day";
|
||||
break;
|
||||
case HOUR:
|
||||
keyword = " hour";
|
||||
break;
|
||||
case MINUTE:
|
||||
keyword = " minute";
|
||||
break;
|
||||
case SECOND:
|
||||
keyword = " second";
|
||||
break;
|
||||
default:
|
||||
throwUnsupported();
|
||||
}
|
||||
|
||||
return DSL.field("({0} + ({1} || {2})::interval)::date", getDataType(), date, interval, inline(keyword));
|
||||
}
|
||||
|
||||
case SQLITE: {
|
||||
switch (datePart) {
|
||||
case YEAR:
|
||||
keyword = " year";
|
||||
break;
|
||||
case MONTH:
|
||||
keyword = " month";
|
||||
break;
|
||||
case DAY:
|
||||
keyword = " day";
|
||||
break;
|
||||
case HOUR:
|
||||
keyword = " hour";
|
||||
break;
|
||||
case MINUTE:
|
||||
keyword = " minute";
|
||||
break;
|
||||
case SECOND:
|
||||
keyword = " second";
|
||||
break;
|
||||
default:
|
||||
throwUnsupported();
|
||||
}
|
||||
|
||||
return DSL.field("{datetime}({0}, '+' || {1} || {2})", getDataType(), date, interval, inline(keyword));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private final void throwUnsupported() {
|
||||
throw new UnsupportedOperationException("Unknown date part : " + datePart);
|
||||
}
|
||||
}
|
||||
54
jOOQ/src/main/java/org/jooq/impl/LocalDateDiff.java
Normal file
54
jOOQ/src/main/java/org/jooq/impl/LocalDateDiff.java
Normal file
@ -0,0 +1,54 @@
|
||||
package org.jooq.impl;
|
||||
|
||||
import static org.jooq.impl.DSL.function;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import org.jooq.Configuration;
|
||||
import org.jooq.Field;
|
||||
|
||||
final class LocalDateDiff extends AbstractFunction<Integer> {
|
||||
|
||||
/**
|
||||
* Generated UID
|
||||
*/
|
||||
private static final long serialVersionUID = 6010434059957641551L;
|
||||
|
||||
private final Field<LocalDate> date1;
|
||||
private final Field<LocalDate> date2;
|
||||
|
||||
LocalDateDiff(Field<LocalDate> date1, Field<LocalDate> date2) {
|
||||
super("localdatediff", SQLDataType.INTEGER, date1, date2);
|
||||
|
||||
this.date1 = date1;
|
||||
this.date2 = date2;
|
||||
}
|
||||
|
||||
@SuppressWarnings("incomplete-switch")
|
||||
@Override
|
||||
final Field<Integer> getFunction0(Configuration configuration) {
|
||||
switch (configuration.family()) {
|
||||
case MARIADB:
|
||||
case MYSQL:
|
||||
return function("datediff", getDataType(), date1, date2);
|
||||
|
||||
case DERBY:
|
||||
return DSL.field("{fn {timestampdiff}({sql_tsi_day}, {0}, {1}) }", getDataType(), date2, date1);
|
||||
|
||||
case FIREBIRD:
|
||||
return DSL.field("{datediff}(day, {0}, {1})", getDataType(), date2, date1);
|
||||
case H2:
|
||||
case HSQLDB:
|
||||
return DSL.field("{datediff}('day', {0}, {1})", getDataType(), date2, date1);
|
||||
case SQLITE:
|
||||
return DSL.field("({strftime}('%s', {0}) - {strftime}('%s', {1})) / 86400", getDataType(), date1, date2);
|
||||
case CUBRID:
|
||||
case POSTGRES:
|
||||
// [#4481] Parentheses are important in case this expression is
|
||||
// placed in the context of other arithmetic
|
||||
return DSL.field("({0} - {1})", getDataType(), date1, date2);
|
||||
}
|
||||
// Default implementation for equals() and hashCode()
|
||||
return date1.sub(date2).cast(Integer.class);
|
||||
}
|
||||
}
|
||||
@ -27,6 +27,7 @@ Authors and contributors of jOOQ or parts of jOOQ in alphabetical order:
|
||||
- Matti Tahvonen
|
||||
- Michael Doberenz
|
||||
- Michał Kołodziejski
|
||||
- Miguel Gonzalez Sanchez
|
||||
- Nathaniel Fischer
|
||||
- Oliver Flege
|
||||
- Peter Ertl
|
||||
@ -49,4 +50,4 @@ Authors and contributors of jOOQ or parts of jOOQ in alphabetical order:
|
||||
- Zoltan Tamasi
|
||||
|
||||
See the following website for details about contributing to jOOQ:
|
||||
https://github.com/jOOQ/jOOQ/blob/master/CONTRIBUTING.md
|
||||
https://github.com/jOOQ/jOOQ/blob/master/CONTRIBUTING.md
|
||||
|
||||
Loading…
Reference in New Issue
Block a user