提交 b10111ba authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Add support for QUARTER date unit

上级 c6fb6c36
...@@ -3725,8 +3725,9 @@ DAY_OF_YEAR(CREATED) ...@@ -3725,8 +3725,9 @@ DAY_OF_YEAR(CREATED)
" "
"Functions (Time and Date)","EXTRACT"," "Functions (Time and Date)","EXTRACT","
EXTRACT ( { YEAR | YY | MONTH | MM | WEEK | ISO_WEEK | DAY | DD | DAY_OF_YEAR EXTRACT ( { YEAR | YY | MONTH | MM | QUARTER | WEEK | ISO_WEEK
| DOY | HOUR | HH | MINUTE | MI | SECOND | SS | MILLISECOND | MS } | DAY | DD | DAY_OF_YEAR | DOY
| HOUR | HH | MINUTE | MI | SECOND | SS | MILLISECOND | MS }
FROM timestamp ) FROM timestamp )
"," ","
Returns a specific value from a timestamps. Returns a specific value from a timestamps.
......
...@@ -169,6 +169,7 @@ public class Function extends Expression implements FunctionCall { ...@@ -169,6 +169,7 @@ public class Function extends Expression implements FunctionCall {
DATE_PART.put("MONTH", MONTH); DATE_PART.put("MONTH", MONTH);
DATE_PART.put("MM", MONTH); DATE_PART.put("MM", MONTH);
DATE_PART.put("M", MONTH); DATE_PART.put("M", MONTH);
DATE_PART.put("QUARTER", QUARTER);
DATE_PART.put("SQL_TSI_WEEK", WEEK); DATE_PART.put("SQL_TSI_WEEK", WEEK);
DATE_PART.put("WW", WEEK); DATE_PART.put("WW", WEEK);
DATE_PART.put("WK", WEEK); DATE_PART.put("WK", WEEK);
...@@ -1814,6 +1815,9 @@ public class Function extends Expression implements FunctionCall { ...@@ -1814,6 +1815,9 @@ public class Function extends Expression implements FunctionCall {
long dateValue = a[0]; long dateValue = a[0];
long timeNanos = a[1]; long timeNanos = a[1];
switch (field) { switch (field) {
case QUARTER:
count *= 3;
//$FALL-THROUGH$
case YEAR: case YEAR:
case MONTH: { case MONTH: {
if (!withDate) { if (!withDate) {
...@@ -1931,6 +1935,10 @@ public class Function extends Expression implements FunctionCall { ...@@ -1931,6 +1935,10 @@ public class Function extends Expression implements FunctionCall {
case MONTH: case MONTH:
return (DateTimeUtils.yearFromDateValue(dateValue2) - DateTimeUtils.yearFromDateValue(dateValue1)) * 12 return (DateTimeUtils.yearFromDateValue(dateValue2) - DateTimeUtils.yearFromDateValue(dateValue1)) * 12
+ DateTimeUtils.monthFromDateValue(dateValue2) - DateTimeUtils.monthFromDateValue(dateValue1); + DateTimeUtils.monthFromDateValue(dateValue2) - DateTimeUtils.monthFromDateValue(dateValue1);
case QUARTER:
return (DateTimeUtils.yearFromDateValue(dateValue2) - DateTimeUtils.yearFromDateValue(dateValue1)) * 4
+ (DateTimeUtils.monthFromDateValue(dateValue2) - 1) / 3
- (DateTimeUtils.monthFromDateValue(dateValue1) - 1) / 3;
case YEAR: case YEAR:
return DateTimeUtils.yearFromDateValue(dateValue2) - DateTimeUtils.yearFromDateValue(dateValue1); return DateTimeUtils.yearFromDateValue(dateValue2) - DateTimeUtils.yearFromDateValue(dateValue1);
default: default:
......
...@@ -120,6 +120,12 @@ SELECT DATEADD('MINUTE', 30, TIME '12:30:55'); ...@@ -120,6 +120,12 @@ SELECT DATEADD('MINUTE', 30, TIME '12:30:55');
SELECT DATEADD('DAY', 1, TIME '12:30:55'); SELECT DATEADD('DAY', 1, TIME '12:30:55');
> exception > exception
SELECT DATEADD('QUARTER', 1, DATE '2010-11-16');
> DATE '2011-02-16'
> -----------------
> 2011-02-16
> rows: 1
SELECT DATEADD('DAY', 10, TIMESTAMP WITH TIME ZONE '2000-01-05 15:00:30.123456789-10'); SELECT DATEADD('DAY', 10, TIMESTAMP WITH TIME ZONE '2000-01-05 15:00:30.123456789-10');
> TIMESTAMP WITH TIME ZONE '2000-01-15 15:00:30.123456789-10' > TIMESTAMP WITH TIME ZONE '2000-01-15 15:00:30.123456789-10'
> ----------------------------------------------------------- > -----------------------------------------------------------
......
...@@ -194,3 +194,34 @@ SELECT DATEDIFF('WEEK', DATE '1969-12-28', DATE '1969-12-29'), DATEDIFF('ISO_WEE ...@@ -194,3 +194,34 @@ SELECT DATEDIFF('WEEK', DATE '1969-12-28', DATE '1969-12-29'), DATEDIFF('ISO_WEE
> - - > - -
> 0 1 > 0 1
> rows: 1 > rows: 1
SELECT DATEDIFF('QUARTER', DATE '2009-12-30', DATE '2009-12-31');
> 0
> -
> 0
> rows: 1
SELECT DATEDIFF('QUARTER', DATE '2010-01-01', DATE '2009-12-31');
> -1
> --
> -1
> rows: 1
SELECT DATEDIFF('QUARTER', DATE '2010-01-01', DATE '2010-01-02');
> 0
> -
> 0
> rows: 1
SELECT DATEDIFF('QUARTER', DATE '2010-01-01', DATE '2010-03-31');
> 0
> -
> 0
> rows: 1
SELECT DATEDIFF('QUARTER', DATE '-1000-01-01', DATE '2000-01-01');
> 12000
> -----
> 12000
> rows: 1
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论