diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index b28af6edc9..f508440668 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({ FIREBIRD, H2, HSQLDB, POSTGRES }) + @Support({ FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) 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({ FIREBIRD, H2, HSQLDB, POSTGRES }) + @Support({ FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) 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({ FIREBIRD, H2, HSQLDB, POSTGRES }) + @Support({ FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) 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({ FIREBIRD, H2, HSQLDB, POSTGRES }) + @Support({ FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) 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({ FIREBIRD, H2, HSQLDB, POSTGRES }) + @Support({ FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) 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({ FIREBIRD, H2, HSQLDB, POSTGRES }) + @Support({ FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) 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({ FIREBIRD, H2, HSQLDB, POSTGRES }) + @Support({ FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) 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({ FIREBIRD, H2, HSQLDB, POSTGRES }) + @Support({ FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) 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 cda9726484..a13470da94 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DateDiff.java +++ b/jOOQ/src/main/java/org/jooq/impl/DateDiff.java @@ -38,6 +38,7 @@ package org.jooq.impl; import static org.jooq.DatePart.DAY; +import static org.jooq.DatePart.EPOCH; import static org.jooq.DatePart.HOUR; import static org.jooq.DatePart.MICROSECOND; import static org.jooq.DatePart.MILLISECOND; @@ -45,13 +46,9 @@ import static org.jooq.DatePart.QUARTER; import static org.jooq.DatePart.YEAR; import static org.jooq.SQLDialect.FIREBIRD; import static org.jooq.SQLDialect.HSQLDB; -import static org.jooq.impl.DSL.epoch; 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.month; -import static org.jooq.impl.DSL.quarter; -import static org.jooq.impl.DSL.year; 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; @@ -96,7 +93,33 @@ final class DateDiff extends AbstractField { case MARIADB: case MYSQL: - ctx.visit(N_DATEDIFF).sql('(').visit(date1).sql(", ").visit(date2).sql(')'); + switch (p) { + case DAY: + ctx.visit(N_DATEDIFF).sql('(').visit(date1).sql(", ").visit(date2).sql(')'); + return; + + case MILLENNIUM: + case CENTURY: + case DECADE: + case YEAR: + ctx.visit(partDiff(p)); + return; + + case QUARTER: + case MONTH: + ctx.visit(monthDiff(p)); + return; + + case MILLISECOND: + ctx.visit(new DateDiff<>(MICROSECOND, date1, date2).div(inline(1000))); + return; + + case NANOSECOND: + ctx.visit(new DateDiff<>(MICROSECOND, date1, date2).times(inline(1000))); + return; + } + + ctx.visit(N_TIMESTAMPDIFF).sql('(').visit(p.toName()).sql(", ").visit(date2).sql(", ").visit(date1).sql(')'); return; case DERBY: @@ -118,12 +141,12 @@ final class DateDiff extends AbstractField { case MILLENNIUM: case CENTURY: case DECADE: - ctx.visit(DSL.extract(date1, p).sub(DSL.extract(date2, p))); + ctx.visit(partDiff(p)); return; case QUARTER: if (ctx.family() == FIREBIRD) { - ctx.visit(new DateDiff<>(YEAR, date1, date2).times(inline(4)).plus(quarter(date1).minus(quarter(date2)))); + ctx.visit(monthDiff(QUARTER)); return; } @@ -172,28 +195,27 @@ final class DateDiff extends AbstractField { case CENTURY: case DECADE: case YEAR: - ctx.visit(DSL.extract(date1, p).minus(DSL.extract(date2, p))); + ctx.visit(partDiff(p)); return; case QUARTER: case MONTH: - ctx.visit(year(date1).minus(year(date2)).times(p == QUARTER ? inline(4) : inline(12)) - .plus(p == QUARTER ? quarter(date1).minus(quarter(date2)) : month(date1).minus(month(date2)))); + ctx.visit(monthDiff(p)); return; case HOUR: case MINUTE: - ctx.visit(epoch(date1).minus(epoch(date2)).div(p == HOUR ? inline(3600) : inline(60))); + ctx.visit(partDiff(EPOCH).div(p == HOUR ? inline(3600) : inline(60))); return; case SECOND: - ctx.visit(epoch(date1).minus(epoch(date2))); + ctx.visit(partDiff(EPOCH)); return; case MILLISECOND: case MICROSECOND: case NANOSECOND: - ctx.visit(epoch(date1).minus(epoch(date2)).times(p == MILLISECOND ? inline(1000) : p == MICROSECOND ? inline(1000000) : inline(1000000000))); + ctx.visit(partDiff(EPOCH).times(p == MILLISECOND ? inline(1_000) : p == MICROSECOND ? inline(1000000) : inline(1_000_000_000))); return; } @@ -225,6 +247,18 @@ final class DateDiff extends AbstractField { } - ctx.visit(castIfNeeded(date1.sub(date2), Integer.class)); + ctx.visit(castIfNeeded(date1.minus(date2), Integer.class)); + } + + private final Field partDiff(DatePart p) { + return DSL.extract(date1, p).minus(DSL.extract(date2, p)); + } + + /** + * Calculate the difference for {@link DatePart#MONTH} or month-based date + * parts like {@link DatePart#QUARTER}. + */ + private final Field monthDiff(DatePart p) { + return partDiff(YEAR).times(p == QUARTER ? inline(4) : inline(12)).plus(partDiff(p)); } }