From bf1def05b413304097020e3a13d77ba8dd5b1b16 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 5 Jun 2020 14:43:52 +0200 Subject: [PATCH] [jOOQ/jOOQ#7900] Improved parameter names MySQL and SQL Server do not agree on the order of parameters (MySQL doesn't even agree with itself between DATEDIFF and TIMESTAMPDIFF!) We need to name parameters to make this clear, and replicate the order of SQL Server and MySQL's TIMESTAMPDIFF() in the new function. --- jOOQ/src/main/java/org/jooq/impl/DSL.java | 160 +++++++++++------- .../src/main/java/org/jooq/impl/DateDiff.java | 32 ++-- 2 files changed, 112 insertions(+), 80 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index f508440668..82ea4537cd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -15274,83 +15274,99 @@ public class DSL { /** - * Get the date difference between date1 - date2 in number of - * days. + * Get the date difference between endDate - startDate in + * number of days. * * @see Field#sub(Field) */ @Support - public static Field dateDiff(Date date1, Date date2) { - return dateDiff(Tools.field(date1), Tools.field(date2)); + public static Field dateDiff(Date endDate, Date startDate) { + return dateDiff(Tools.field(endDate), Tools.field(startDate)); } /** - * Get the date difference between date1 - date2 in number of - * days. + * Get the date difference between endDate - startDate in + * number of days. * * @see Field#sub(Field) */ @Support - public static Field dateDiff(Field date1, Date date2) { - return dateDiff(nullSafe(date1), Tools.field(date2)); + public static Field dateDiff(Field endDate, Date startDate) { + return dateDiff(nullSafe(endDate), Tools.field(startDate)); } /** - * Get the date difference between date1 - date2 in number of - * days. + * Get the date difference between endDate - startDate in + * number of days. * * @see Field#sub(Field) */ @Support - public static Field dateDiff(Date date1, Field date2) { - return dateDiff(Tools.field(date1), nullSafe(date2)); + public static Field dateDiff(Date endDate, Field startDate) { + return dateDiff(Tools.field(endDate), nullSafe(startDate)); } /** - * Get the date difference between date1 - date2 in number of - * days. + * Get the date difference between endDate - startDate in + * number of days. * * @see Field#sub(Field) */ @Support - public static Field dateDiff(Field date1, Field date2) { - return new DateDiff<>(null, nullSafe(date1), nullSafe(date2)); + public static Field dateDiff(Field endDate, Field startDate) { + return new DateDiff<>(null, nullSafe(startDate), nullSafe(endDate)); } /** - * Get the date difference between date1 - date2 in terms of - * part. + * Get the date difference between endDate - startDate in terms + * of part. + *

+ * For example, DATEDIFF(YEAR, '2000-03-01', '2002-01-01') = 2, + * despite there being less than 2 years between the two days. The behaviour + * replicates that of SQL Server. */ @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)); + public static Field dateDiff(DatePart part, Date startDate, Date endDate) { + return dateDiff(part, Tools.field(startDate), Tools.field(endDate)); } /** - * Get the date difference between date1 - date2 in terms of - * part. + * Get the date difference between endDate - startDate in terms + * of part. + *

+ * For example, DATEDIFF(YEAR, '2000-03-01', '2002-01-01') = 2, + * despite there being less than 2 years between the two days. The behaviour + * replicates that of SQL Server. */ @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)); + public static Field dateDiff(DatePart part, Field startDate, Date endDate) { + return dateDiff(part, nullSafe(startDate), Tools.field(endDate)); } /** - * Get the date difference between date1 - date2 in terms of - * part. + * Get the date difference between endDate - startDate in terms + * of part. + *

+ * For example, DATEDIFF(YEAR, '2000-03-01', '2002-01-01') = 2, + * despite there being less than 2 years between the two days. The behaviour + * replicates that of SQL Server. */ @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)); + public static Field dateDiff(DatePart part, Date startDate, Field endDate) { + return dateDiff(part, Tools.field(startDate), nullSafe(endDate)); } /** - * Get the date difference between date1 - date2 in terms of - * part. + * Get the date difference between endDate - startDate in terms + * of part. + *

+ * For example, DATEDIFF(YEAR, '2000-03-01', '2002-01-01') = 2, + * despite there being less than 2 years between the two days. The behaviour + * replicates that of SQL Server. */ @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)); + public static Field dateDiff(DatePart part, Field startDate, Field endDate) { + return new DateDiff<>(part, nullSafe(startDate), nullSafe(endDate)); } /** @@ -15664,83 +15680,99 @@ public class DSL { /** - * Get the date difference between date1 - date2 in number of - * days. + * Get the date difference between endDate - startDate in + * number of days. * * @see Field#sub(Field) */ @Support - public static Field localDateDiff(LocalDate date1, LocalDate date2) { - return localDateDiff(Tools.field(date1), Tools.field(date2)); + public static Field localDateDiff(LocalDate endDate, LocalDate startDate) { + return localDateDiff(Tools.field(endDate), Tools.field(startDate)); } /** - * Get the date difference between date1 - date2 in number of - * days. + * Get the date difference between endDate - startDate in + * number of days. * * @see Field#sub(Field) */ @Support - public static Field localDateDiff(Field date1, LocalDate date2) { - return localDateDiff(nullSafe(date1), Tools.field(date2)); + public static Field localDateDiff(Field endDate, LocalDate startDate) { + return localDateDiff(nullSafe(endDate), Tools.field(startDate)); } /** - * Get the date difference between date1 - date2 in number of - * days. + * Get the date difference between endDate - startDate in + * number of days. * * @see Field#sub(Field) */ @Support - public static Field localDateDiff(LocalDate date1, Field date2) { - return localDateDiff(Tools.field(date1), nullSafe(date2)); + public static Field localDateDiff(LocalDate endDate, Field startDate) { + return localDateDiff(Tools.field(endDate), nullSafe(startDate)); } /** - * Get the date difference between date1 - date2 in number of - * days. + * Get the date difference between endDate - startDate in + * number of days. * * @see Field#sub(Field) */ @Support - public static Field localDateDiff(Field date1, Field date2) { - return new DateDiff<>(null, nullSafe(date1), nullSafe(date2)); + public static Field localDateDiff(Field endDate, Field startDate) { + return new DateDiff<>(null, nullSafe(startDate), nullSafe(endDate)); } /** - * Get the date difference between date1 - date2 in terms of - * part. + * Get the date difference between endDate - startDate in terms + * of part. + *

+ * For example, DATEDIFF(YEAR, '2000-03-01', '2002-01-01') = 2, + * despite there being less than 2 years between the two days. The behaviour + * replicates that of SQL Server. */ @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)); + public static Field localDateDiff(DatePart part, LocalDate startDate, LocalDate endDate) { + return localDateDiff(part, Tools.field(startDate), Tools.field(endDate)); } /** - * Get the date difference between date1 - date2 in terms of - * part. + * Get the date difference between endDate - startDate in terms + * of part. + *

+ * For example, DATEDIFF(YEAR, '2000-03-01', '2002-01-01') = 2, + * despite there being less than 2 years between the two days. The behaviour + * replicates that of SQL Server. */ @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)); + public static Field localDateDiff(DatePart part, Field startDate, LocalDate endDate) { + return localDateDiff(part, nullSafe(startDate), Tools.field(endDate)); } /** - * Get the date difference between date1 - date2 in terms of - * part. + * Get the date difference between endDate - startDate in terms + * of part. + *

+ * For example, DATEDIFF(YEAR, '2000-03-01', '2002-01-01') = 2, + * despite there being less than 2 years between the two days. The behaviour + * replicates that of SQL Server. */ @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)); + public static Field localDateDiff(DatePart part, LocalDate startDate, Field endDate) { + return localDateDiff(part, Tools.field(startDate), nullSafe(endDate)); } /** - * Get the date difference between date1 - date2 in terms of - * part. + * Get the date difference between endDate - startDate in terms + * of part. + *

+ * For example, DATEDIFF(YEAR, '2000-03-01', '2002-01-01') = 2, + * despite there being less than 2 years between the two days. The behaviour + * replicates that of SQL Server. */ @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)); + public static Field localDateDiff(DatePart part, Field startDate, Field endDate) { + return new DateDiff<>(part, nullSafe(startDate), nullSafe(endDate)); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/DateDiff.java b/jOOQ/src/main/java/org/jooq/impl/DateDiff.java index fce26438b6..270f3dfdf2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DateDiff.java +++ b/jOOQ/src/main/java/org/jooq/impl/DateDiff.java @@ -72,15 +72,15 @@ final class DateDiff extends AbstractField { private static final long serialVersionUID = -4813228000332771961L; private final DatePart part; - private final Field date1; - private final Field date2; + private final Field startDate; + private final Field endDate; - DateDiff(DatePart part, Field date1, Field date2) { + DateDiff(DatePart part, Field startDate, Field endDate) { super(N_DATEDIFF, SQLDataType.INTEGER); this.part = part; - this.date1 = date1; - this.date2 = date2; + this.startDate = startDate; + this.endDate = endDate; } @Override @@ -108,23 +108,23 @@ final class DateDiff extends AbstractField { return; case DAY: - ctx.visit(N_DATEDIFF).sql('(').visit(date1).sql(", ").visit(date2).sql(')'); + ctx.visit(N_DATEDIFF).sql('(').visit(endDate).sql(", ").visit(startDate).sql(')'); return; case MILLISECOND: - ctx.visit(new DateDiff<>(MICROSECOND, date1, date2).div(inline(1000))); + ctx.visit(new DateDiff<>(MICROSECOND, startDate, endDate).div(inline(1000))); return; case NANOSECOND: - ctx.visit(new DateDiff<>(MICROSECOND, date1, date2).times(inline(1000))); + ctx.visit(new DateDiff<>(MICROSECOND, startDate, endDate).times(inline(1000))); return; } - ctx.visit(N_TIMESTAMPDIFF).sql('(').visit(p.toName()).sql(", ").visit(date2).sql(", ").visit(date1).sql(')'); + ctx.visit(N_TIMESTAMPDIFF).sql('(').visit(p.toName()).sql(", ").visit(startDate).sql(", ").visit(endDate).sql(')'); return; case DERBY: - ctx.sql("{fn ").visit(N_TIMESTAMPDIFF).sql('(').visit(keyword("sql_tsi_day")).sql(", ").visit(date2).sql(", ").visit(date1).sql(") }"); + ctx.sql("{fn ").visit(N_TIMESTAMPDIFF).sql('(').visit(keyword("sql_tsi_day")).sql(", ").visit(startDate).sql(", ").visit(endDate).sql(") }"); return; @@ -160,14 +160,14 @@ final class DateDiff extends AbstractField { 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(')'); + ctx.visit(N_DATEDIFF).sql('(').visit(p.toKeyword()).sql(", ").visit(startDate.cast(TIMESTAMP)).sql(", ").visit(endDate.cast(TIMESTAMP)).sql(')'); return; } break; } - ctx.visit(N_DATEDIFF).sql('(').visit(p.toKeyword()).sql(", ").visit(date2).sql(", ").visit(date1).sql(')'); + ctx.visit(N_DATEDIFF).sql('(').visit(p.toKeyword()).sql(", ").visit(startDate).sql(", ").visit(endDate).sql(')'); return; @@ -177,7 +177,7 @@ final class DateDiff extends AbstractField { case SQLITE: - ctx.sql('(').visit(N_STRFTIME).sql("('%s', ").visit(date1).sql(") - ").visit(N_STRFTIME).sql("('%s', ").visit(date2).sql(")) / 86400"); + ctx.sql('(').visit(N_STRFTIME).sql("('%s', ").visit(endDate).sql(") - ").visit(N_STRFTIME).sql("('%s', ").visit(startDate).sql(")) / 86400"); return; @@ -218,7 +218,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(')'); + ctx.sql('(').visit(endDate).sql(" - ").visit(startDate).sql(')'); return; } @@ -248,11 +248,11 @@ final class DateDiff extends AbstractField { } - ctx.visit(castIfNeeded(date1.minus(date2), Integer.class)); + ctx.visit(castIfNeeded(endDate.minus(startDate), Integer.class)); } private final Field partDiff(DatePart p) { - return DSL.extract(date1, p).minus(DSL.extract(date2, p)); + return DSL.extract(endDate, p).minus(DSL.extract(startDate, p)); } /**