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, '(');