diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java
index 105c690aad..3e6715b6bc 100644
--- a/jOOQ/src/main/java/org/jooq/impl/DSL.java
+++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java
@@ -15321,7 +15321,7 @@ public class DSL {
* Get the date difference between date1 - date2 in terms of
* part.
*/
- @Support({ H2 })
+ @Support({ FIREBIRD, H2, HSQLDB })
public static Field dateDiff(DatePart part, Date date1, Date date2) {
return dateDiff(part, Tools.field(date1), Tools.field(date2));
}
@@ -15330,7 +15330,7 @@ public class DSL {
* Get the date difference between date1 - date2 in terms of
* part.
*/
- @Support({ H2 })
+ @Support({ FIREBIRD, H2, HSQLDB })
public static Field dateDiff(DatePart part, Field date1, Date date2) {
return dateDiff(part, nullSafe(date1), Tools.field(date2));
}
@@ -15339,7 +15339,7 @@ public class DSL {
* Get the date difference between date1 - date2 in terms of
* part.
*/
- @Support({ H2 })
+ @Support({ FIREBIRD, H2, HSQLDB })
public static Field dateDiff(DatePart part, Date date1, Field date2) {
return dateDiff(part, Tools.field(date1), nullSafe(date2));
}
@@ -15348,7 +15348,7 @@ public class DSL {
* Get the date difference between date1 - date2 in terms of
* part.
*/
- @Support({ H2 })
+ @Support({ FIREBIRD, H2, HSQLDB })
public static Field dateDiff(DatePart part, Field date1, Field date2) {
return new DateDiff<>(part, nullSafe(date1), nullSafe(date2));
}
@@ -15711,7 +15711,7 @@ public class DSL {
* Get the date difference between date1 - date2 in terms of
* part.
*/
- @Support({ H2 })
+ @Support({ FIREBIRD, H2, HSQLDB })
public static Field localDateDiff(DatePart part, LocalDate date1, LocalDate date2) {
return localDateDiff(part, Tools.field(date1), Tools.field(date2));
}
@@ -15720,7 +15720,7 @@ public class DSL {
* Get the date difference between date1 - date2 in terms of
* part.
*/
- @Support({ H2 })
+ @Support({ FIREBIRD, H2, HSQLDB })
public static Field localDateDiff(DatePart part, Field date1, LocalDate date2) {
return localDateDiff(part, nullSafe(date1), Tools.field(date2));
}
@@ -15729,7 +15729,7 @@ public class DSL {
* Get the date difference between date1 - date2 in terms of
* part.
*/
- @Support({ H2 })
+ @Support({ FIREBIRD, H2, HSQLDB })
public static Field localDateDiff(DatePart part, LocalDate date1, Field date2) {
return localDateDiff(part, Tools.field(date1), nullSafe(date2));
}
@@ -15738,7 +15738,7 @@ public class DSL {
* Get the date difference between date1 - date2 in terms of
* part.
*/
- @Support({ H2 })
+ @Support({ FIREBIRD, H2, HSQLDB })
public static Field localDateDiff(DatePart part, Field date1, Field date2) {
return new DateDiff<>(part, nullSafe(date1), nullSafe(date2));
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/DateDiff.java b/jOOQ/src/main/java/org/jooq/impl/DateDiff.java
index f1f41c369e..f5d3730ff5 100644
--- a/jOOQ/src/main/java/org/jooq/impl/DateDiff.java
+++ b/jOOQ/src/main/java/org/jooq/impl/DateDiff.java
@@ -38,13 +38,19 @@
package org.jooq.impl;
import static org.jooq.DatePart.DAY;
+import static org.jooq.DatePart.YEAR;
+import static org.jooq.SQLDialect.FIREBIRD;
+import static org.jooq.SQLDialect.HSQLDB;
import static org.jooq.impl.DSL.function;
+import static org.jooq.impl.DSL.inline;
import static org.jooq.impl.DSL.keyword;
+import static org.jooq.impl.DSL.quarter;
import static org.jooq.impl.Keywords.K_DAY;
import static org.jooq.impl.Names.N_DATEDIFF;
import static org.jooq.impl.Names.N_DAYS_BETWEEN;
import static org.jooq.impl.Names.N_STRFTIME;
import static org.jooq.impl.Names.N_TIMESTAMPDIFF;
+import static org.jooq.impl.SQLDataType.TIMESTAMP;
import static org.jooq.impl.Tools.castIfNeeded;
import org.jooq.Context;
@@ -85,16 +91,13 @@ final class DateDiff extends AbstractField {
case MARIADB:
case MYSQL:
ctx.visit(N_DATEDIFF).sql('(').visit(date1).sql(", ").visit(date2).sql(')');
- break;
+ return;
case DERBY:
ctx.sql("{fn ").visit(N_TIMESTAMPDIFF).sql('(').visit(keyword("sql_tsi_day")).sql(", ").visit(date2).sql(", ").visit(date1).sql(") }");
- break;
+ return;
case FIREBIRD:
- ctx.visit(N_DATEDIFF).sql('(').visit(K_DAY).sql(", ").visit(date2).sql(", ").visit(date1).sql(')');
- break;
-
case H2:
case HSQLDB:
switch (p) {
@@ -102,14 +105,28 @@ final class DateDiff extends AbstractField {
case CENTURY:
case DECADE:
ctx.visit(DSL.extract(date1, p).sub(DSL.extract(date2, p)));
- break;
+ return;
- default:
- ctx.visit(N_DATEDIFF).sql('(').visit(p.toKeyword()).sql(", ").visit(date2).sql(", ").visit(date1).sql(')');
- break;
+ case QUARTER:
+ if (ctx.family() == FIREBIRD) {
+ ctx.visit(new DateDiff<>(YEAR, date1, date2).times(inline(4)).plus(quarter(date1).minus(quarter(date2))));
+ return;
+ }
+
+ case HOUR:
+ case MINUTE:
+ case SECOND:
+ case MILLISECOND:
+ case MICROSECOND:
+ case NANOSECOND:
+ if (ctx.family() == HSQLDB) {
+ ctx.visit(N_DATEDIFF).sql('(').visit(p.toKeyword()).sql(", ").visit(date2.cast(TIMESTAMP)).sql(", ").visit(date1.cast(TIMESTAMP)).sql(')');
+ return;
+ }
}
- break;
+ ctx.visit(N_DATEDIFF).sql('(').visit(p.toKeyword()).sql(", ").visit(date2).sql(", ").visit(date1).sql(')');
+ return;
@@ -132,7 +149,7 @@ final class DateDiff extends AbstractField {
// [#4481] Parentheses are important in case this expression is
// placed in the context of other arithmetic
ctx.sql('(').visit(date1).sql(" - ").visit(date2).sql(')');
- break;
+ return;
@@ -159,9 +176,8 @@ final class DateDiff extends AbstractField {
default:
- // Default implementation for equals() and hashCode()
ctx.visit(castIfNeeded(date1.sub(date2), Integer.class));
- break;
+ return;
}
}
}