Skip to content

Commit 9cb890e

Browse files
committed
fix(schema-compiler): Fix BigQuery DATE_ADD push down template for years/quarters/months
1 parent c1e5128 commit 9cb890e

File tree

1 file changed

+13
-3
lines changed

1 file changed

+13
-3
lines changed

packages/cubejs-schema-compiler/src/adapter/BigqueryQuery.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,11 +186,21 @@ export class BigqueryQuery extends BaseQuery {
186186
}
187187

188188
public subtractTimestampInterval(date, interval) {
189-
return `TIMESTAMP_SUB(${date}, INTERVAL ${this.formatInterval(interval)[0]})`;
189+
const [intervalFormatted, timeUnit] = this.formatInterval(interval);
190+
if (['YEAR', 'MONTH', 'QUARTER'].includes(timeUnit)) {
191+
return this.timeStampCast(`DATETIME_SUB(DATETIME(${date}), INTERVAL ${intervalFormatted})`);
192+
}
193+
194+
return `TIMESTAMP_SUB(${date}, INTERVAL ${intervalFormatted})`;
190195
}
191196

192197
public addTimestampInterval(date, interval) {
193-
return `TIMESTAMP_ADD(${date}, INTERVAL ${this.formatInterval(interval)[0]})`;
198+
const [intervalFormatted, timeUnit] = this.formatInterval(interval);
199+
if (['YEAR', 'MONTH', 'QUARTER'].includes(timeUnit)) {
200+
return this.timeStampCast(`DATETIME_ADD(DATETIME(${date}), INTERVAL ${intervalFormatted})`);
201+
}
202+
203+
return `TIMESTAMP_ADD(${date}, INTERVAL ${intervalFormatted})`;
194204
}
195205

196206
public nowTimestampSql() {
@@ -242,7 +252,7 @@ export class BigqueryQuery extends BaseQuery {
242252
templates.functions.STRPOS = 'STRPOS({{ args_concat }})';
243253
templates.functions.DATEDIFF = 'DATETIME_DIFF(CAST({{ args[2] }} AS DATETIME), CAST({{ args[1] }} AS DATETIME), {{ date_part }})';
244254
// DATEADD is being rewritten to DATE_ADD
245-
// templates.functions.DATEADD = 'DATETIME_ADD(CAST({{ args[2] }} AS DATETTIME), INTERVAL {{ interval }} {{ date_part }})';
255+
templates.functions.DATE_ADD = '{% if date_part|upper in [\'YEAR\', \'MONTH\', \'QUARTER\'] %}TIMESTAMP(DATETIME_ADD(DATETIME({{ args[2] }}), INTERVAL {{ interval }} {{ date_part }})){% else %}TIMESTAMP_ADD({{ args[2] }}, INTERVAL {{ interval }} {{ date_part }}){% endif %}';
246256
templates.functions.CURRENTDATE = 'CURRENT_DATE';
247257
delete templates.functions.TO_CHAR;
248258
templates.expressions.binary = '{% if op == \'%\' %}MOD({{ left }}, {{ right }}){% else %}({{ left }} {{ op }} {{ right }}){% endif %}';

0 commit comments

Comments
 (0)