diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/DataTypeTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/DataTypeTests.java index 0fa6ea51dc..1cf3065453 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/DataTypeTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/DataTypeTests.java @@ -88,6 +88,7 @@ import java.util.UUID; import org.jooq.Converter; import org.jooq.DSLContext; import org.jooq.DataType; +import org.jooq.DatePart; import org.jooq.Field; import org.jooq.InsertSetMoreStep; import org.jooq.Record; @@ -102,6 +103,7 @@ import org.jooq.SQLDialect; import org.jooq.TableRecord; import org.jooq.UpdatableRecord; import org.jooq.conf.Settings; +import org.jooq.impl.DSL; import org.jooq.impl.SQLDataType; import org.jooq.test.BaseTest; import org.jooq.test.jOOQAbstractTest; @@ -1574,6 +1576,50 @@ extends BaseTest r1 = create().select( + DSL.timestampAdd(new Timestamp(cal.getTimeInMillis()), 2, DatePart.YEAR) .as("yy"), + DSL.timestampAdd(new Timestamp(cal.getTimeInMillis()), 2, DatePart.MONTH) .as("mm"), + DSL.timestampAdd(new Timestamp(cal.getTimeInMillis()), 2, DatePart.DAY) .as("dd"), + DSL.timestampAdd(new Timestamp(cal.getTimeInMillis()), 2, DatePart.HOUR) .as("hh"), + DSL.timestampAdd(new Timestamp(cal.getTimeInMillis()), 2, DatePart.MINUTE).as("mi"), + DSL.timestampAdd(new Timestamp(cal.getTimeInMillis()), 2, DatePart.SECOND).as("ss") + ).fetchOne(); + + cal = cal(); cal.add(Calendar.YEAR , 2); assertEquals(new Timestamp(cal.getTimeInMillis()), r1.value1()); + cal = cal(); cal.add(Calendar.MONTH , 2); assertEquals(new Timestamp(cal.getTimeInMillis()), r1.value2()); + cal = cal(); cal.add(Calendar.DAY_OF_YEAR, 2); assertEquals(new Timestamp(cal.getTimeInMillis()), r1.value3()); + cal = cal(); cal.add(Calendar.HOUR , 2); assertEquals(new Timestamp(cal.getTimeInMillis()), r1.value4()); + cal = cal(); cal.add(Calendar.MINUTE , 2); assertEquals(new Timestamp(cal.getTimeInMillis()), r1.value5()); + cal = cal(); cal.add(Calendar.SECOND , 2); assertEquals(new Timestamp(cal.getTimeInMillis()), r1.value6()); + + // Subtracting + cal = cal(); + + Record6 r2 = create().select( + DSL.timestampAdd(new Timestamp(cal.getTimeInMillis()), -2, DatePart.YEAR) .as("yy"), + DSL.timestampAdd(new Timestamp(cal.getTimeInMillis()), -2, DatePart.MONTH) .as("mm"), + DSL.timestampAdd(new Timestamp(cal.getTimeInMillis()), -2, DatePart.DAY) .as("dd"), + DSL.timestampAdd(new Timestamp(cal.getTimeInMillis()), -2, DatePart.HOUR) .as("hh"), + DSL.timestampAdd(new Timestamp(cal.getTimeInMillis()), -2, DatePart.MINUTE).as("mi"), + DSL.timestampAdd(new Timestamp(cal.getTimeInMillis()), -2, DatePart.SECOND).as("ss") + ).fetchOne(); + + cal = cal(); cal.add(Calendar.YEAR , -2); assertEquals(new Timestamp(cal.getTimeInMillis()), r2.value1()); + cal = cal(); cal.add(Calendar.MONTH , -2); assertEquals(new Timestamp(cal.getTimeInMillis()), r2.value2()); + cal = cal(); cal.add(Calendar.DAY_OF_YEAR, -2); assertEquals(new Timestamp(cal.getTimeInMillis()), r2.value3()); + cal = cal(); cal.add(Calendar.HOUR , -2); assertEquals(new Timestamp(cal.getTimeInMillis()), r2.value4()); + cal = cal(); cal.add(Calendar.MINUTE , -2); assertEquals(new Timestamp(cal.getTimeInMillis()), r2.value5()); + cal = cal(); cal.add(Calendar.SECOND , -2); assertEquals(new Timestamp(cal.getTimeInMillis()), r2.value6()); + + } + private Calendar cal() { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(-3600000); diff --git a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java index 6e6ad3e01d..29e3c082e1 100644 --- a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java +++ b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java @@ -1776,6 +1776,11 @@ public abstract class jOOQAbstractTest< new DataTypeTests(this).testDateTimeArithmetic(); } + @Test + public void testFunctionsOnDates_DATE_ADD() throws Exception { + new DataTypeTests(this).testFunctionsOnDates_DATE_ADD(); + } + @Test public void testCurrentDate() throws Exception { new DataTypeTests(this).testCurrentDate(); diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 519eea818b..0542fcac8b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -7565,6 +7565,46 @@ public class DSL { return nullSafe(date).add(interval); } + /** + * Add an interval to a date, given a date part. + *

+ * This translates into any dialect + */ + @Support + public static Field dateAdd(Date date, Number interval, DatePart datePart) { + return new DateAdd(Utils.field(date), Utils.field(interval), datePart); + } + + /** + * Add an interval to a date, given a date part. + *

+ * This translates into any dialect + */ + @Support + public static Field dateAdd(Date date, Field interval, DatePart datePart) { + return new DateAdd(Utils.field(date), nullSafe(interval), datePart); + } + + /** + * Add an interval to a date, given a date part. + *

+ * This translates into any dialect + */ + @Support + public static Field dateAdd(Field date, Number interval, DatePart datePart) { + return new DateAdd(nullSafe(date), Utils.field(interval), datePart); + } + + /** + * Add an interval to a date, given a date part. + *

+ * This translates into any dialect + */ + @Support + public static Field dateAdd(Field date, Field interval, DatePart datePart) { + return new DateAdd(nullSafe(date), nullSafe(interval), datePart); + } + /** * Get the date difference in number of days. *

@@ -7645,6 +7685,46 @@ public class DSL { return nullSafe(timestamp).add(interval); } + /** + * Add an interval to a timestamp, given a date part. + *

+ * This translates into any dialect + */ + @Support + public static Field timestampAdd(Timestamp date, Number interval, DatePart datePart) { + return new DateAdd(Utils.field(date), Utils.field(interval), datePart); + } + + /** + * Add an interval to a timestamp, given a date part. + *

+ * This translates into any dialect + */ + @Support + public static Field timestampAdd(Timestamp date, Field interval, DatePart datePart) { + return new DateAdd(Utils.field(date), nullSafe(interval), datePart); + } + + /** + * Add an interval to a timestamp, given a date part. + *

+ * This translates into any dialect + */ + @Support + public static Field timestampAdd(Field date, Number interval, DatePart datePart) { + return new DateAdd(nullSafe(date), Utils.field(interval), datePart); + } + + /** + * Add an interval to a timestamp, given a date part. + *

+ * This translates into any dialect + */ + @Support + public static Field timestampAdd(Field date, Field interval, DatePart datePart) { + return new DateAdd(nullSafe(date), nullSafe(interval), datePart); + } + /** * Get the timestamp difference as a INTERVAL DAY TO SECOND * type. diff --git a/jOOQ/src/main/java/org/jooq/impl/Expression.java b/jOOQ/src/main/java/org/jooq/impl/Expression.java index 8ee55a977b..7f5565262a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Expression.java +++ b/jOOQ/src/main/java/org/jooq/impl/Expression.java @@ -414,7 +414,7 @@ class Expression extends AbstractFunction { x xxxx xxxxxxx x - xxxxx xxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxx xxxxxxxxxx xxx xxxxxxxxx xx xxxxxxx xxxxxxxxxxxxx xxxxxxxxxxx + xxxxx xxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxx xxxxxxxxxxx xx xxx xxx xxxxxxxxxxxxxx x xxxx xxxxxxx