@@ -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