diff --git a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt index 39baa9f226..9fe6dd96fa 100644 --- a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt +++ b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt @@ -709,6 +709,7 @@ term = | ( 'PERCENTILE_CONT' | 'PERCENTILE_DISC' ) '(' unsignedNumericLiteral ')' withinGroup [ over ] | ( 'POW' | 'POWER' ) '(' field ',' field ')' | 'PRIOR' concat +| 'QUARTER' '(' field ')' | ( 'REGR_SLOPE' | 'REGR_INTERCEPT' diff --git a/jOOQ/src/main/java/org/jooq/DatePart.java b/jOOQ/src/main/java/org/jooq/DatePart.java index 14546a511d..44bcd39c52 100644 --- a/jOOQ/src/main/java/org/jooq/DatePart.java +++ b/jOOQ/src/main/java/org/jooq/DatePart.java @@ -173,11 +173,8 @@ public enum DatePart { /** * The quarter. Jan-Mar = 1, Apr-Jun = 2, Jul-Sep = 3, Oct-Dec = 4. - * - * @deprecated - 3.11 - [#2132] Support for this type is still experimental */ - @Support({ POSTGRES }) - @Deprecated + @Support QUARTER("quarter"), /** diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 1b7394e04a..5b2d1d7636 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -14740,6 +14740,43 @@ public class DSL { return extract(field, DatePart.EPOCH); } + /** + * Get the quarter of a date. + *

+ * This is the same as calling {@link #extract(Field, DatePart)} + * with {@link DatePart#QUARTER} + */ + @Support + public static Field quarter(java.util.Date value) { + return extract(value, DatePart.QUARTER); + } + + + + /** + * Get the quarter of a date. + *

+ * This is the same as calling {@link #extract(Field, DatePart)} + * with {@link DatePart#QUARTER} + */ + @Support + public static Field quarter(Temporal value) { + return extract(value, DatePart.QUARTER); + } + + + + /** + * Get the quarter of a date. + *

+ * This is the same as calling {@link #extract(Field, DatePart)} + * with {@link DatePart#QUARTER} + */ + @Support + public static Field quarter(Field field) { + return extract(field, DatePart.QUARTER); + } + /** * Get the year part of a date. *

diff --git a/jOOQ/src/main/java/org/jooq/impl/Extract.java b/jOOQ/src/main/java/org/jooq/impl/Extract.java index 6c2ef8c2d2..be8e22d378 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Extract.java +++ b/jOOQ/src/main/java/org/jooq/impl/Extract.java @@ -50,7 +50,6 @@ import java.sql.Timestamp; import org.jooq.Configuration; import org.jooq.DatePart; import org.jooq.Field; -import org.jooq.exception.SQLDialectNotSupportedException; /** * @author Lukas Eder @@ -97,7 +96,7 @@ final class Extract extends AbstractFunction { case DAY_OF_YEAR: return DSL.field("{strftime}('%j', {0})", INTEGER, field); default: - throw new SQLDialectNotSupportedException("DatePart not supported: " + datePart); + return getNativeFunction(); } @@ -152,7 +151,13 @@ final class Extract extends AbstractFunction { - throw new SQLDialectNotSupportedException("DatePart not supported: " + datePart); + + + return getNativeFunction(); + + + + @@ -241,6 +246,8 @@ final class Extract extends AbstractFunction { switch (datePart) { case EPOCH: return DSL.field("{unix_timestamp}({0})", INTEGER, field); + case QUARTER: + return DSL.field("{quarter}({0})", INTEGER, field); case ISO_DAY_OF_WEEK: return DSL.field("{weekday}({0})", INTEGER, field).add(one()); case DAY_OF_WEEK: @@ -255,6 +262,8 @@ final class Extract extends AbstractFunction { case POSTGRES: switch (datePart) { + case QUARTER: + return DSL.field("{extract}({quarter from} {0})", INTEGER, field); case DAY_OF_WEEK: return DSL.field("({extract}({dow from} {0}) + 1)", INTEGER, field); case ISO_DAY_OF_WEEK: @@ -267,16 +276,21 @@ final class Extract extends AbstractFunction { case HSQLDB: switch (datePart) { + case QUARTER: + return DSL.field("{quarter}({0})", INTEGER, field); case ISO_DAY_OF_WEEK: return dowSun1ToISO(DSL.field("{extract}({day_of_week from} {0})", INTEGER, field)); default: return getNativeFunction(); } - - - - case H2: + switch (datePart) { + case QUARTER: + return DSL.field("{quarter}({0})", INTEGER, field); + default: + return getNativeFunction(); + } + default: return getNativeFunction(); } @@ -295,6 +309,11 @@ final class Extract extends AbstractFunction { } private final Field getNativeFunction() { - return DSL.field("{extract}({0} {from} {1})", INTEGER, datePart.toKeyword(), field); + switch (datePart) { + case QUARTER: + return DSL.month(field).add(inline(2)).div(inline(3)); + default: + return DSL.field("{extract}({0} {from} {1})", INTEGER, datePart.toKeyword(), field); + } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 6ad41a3e00..637d3ab96b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -167,6 +167,7 @@ import static org.jooq.impl.DSL.position; import static org.jooq.impl.DSL.primaryKey; import static org.jooq.impl.DSL.prior; import static org.jooq.impl.DSL.privilege; +import static org.jooq.impl.DSL.quarter; import static org.jooq.impl.DSL.rad; import static org.jooq.impl.DSL.rangeBetweenCurrentRow; import static org.jooq.impl.DSL.rangeBetweenFollowing; @@ -4740,6 +4741,10 @@ final class ParserImpl implements Parser { if (ctx.characterNext() == '\'') return inline(parseStringLiteral(ctx)); + if (D.is(type)) + if ((field = parseFieldQuarterIf(ctx)) != null) + return field; + case 'r': case 'R': if (S.is(type)) @@ -6153,6 +6158,17 @@ final class ParserImpl implements Parser { return null; } + private static final Field parseFieldQuarterIf(ParserContext ctx) { + if (parseFunctionNameIf(ctx, "QUARTER")) { + parse(ctx, '('); + Field f1 = (Field) parseField(ctx, D); + parse(ctx, ')'); + return quarter(f1); + } + + return null; + } + private static final Field parseFieldHourIf(ParserContext ctx) { if (parseFunctionNameIf(ctx, "HOUR")) { parse(ctx, '(');