{"record":{"id":"fac652126ebb03df","repo":"cube-js/cube","slug":"cannot-transform-interval-expression-interval-fac652","errorCode":null,"errorMessage":"Cannot transform interval expression \"${interval}\" to BigQuery dialect","messagePattern":"Cannot transform interval expression \"(.+?)\" to BigQuery dialect","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/cubejs-schema-compiler/src/adapter/BigqueryQuery.ts","lineNumber":134,"sourceCode":"    } else if (intervalParsed.day && intKeys === 1) {\n      return [`${intervalParsed.day} DAY`, 'DAY'];\n    } else if (intervalParsed.day && intervalParsed.hour && intKeys === 2) {\n      return [`'${intervalParsed.day} ${intervalParsed.hour}' DAY TO HOUR`, 'HOUR'];\n    } else if (intervalParsed.day && intervalParsed.hour && intervalParsed.minute && intKeys === 3) {\n      return [`'${intervalParsed.day} ${intervalParsed.hour}:${intervalParsed.minute}' DAY TO MINUTE`, 'MINUTE'];\n    } else if (intervalParsed.day && intervalParsed.hour && intervalParsed.minute && intervalParsed.second && intKeys === 4) {\n      return [`'${intervalParsed.day} ${intervalParsed.hour}:${intervalParsed.minute}:${intervalParsed.second}' DAY TO SECOND`, 'SECOND'];\n    } else if (intervalParsed.hour && intervalParsed.minute && intKeys === 2) {\n      return [`'${intervalParsed.hour}:${intervalParsed.minute}' HOUR TO MINUTE`, 'MINUTE'];\n    } else if (intervalParsed.hour && intervalParsed.minute && intervalParsed.second && intKeys === 3) {\n      return [`'${intervalParsed.hour}:${intervalParsed.minute}:${intervalParsed.second}' HOUR TO SECOND`, 'SECOND'];\n    } else if (intervalParsed.minute && intervalParsed.second && intKeys === 2) {\n      return [`'${intervalParsed.minute}:${intervalParsed.second}' MINUTE TO SECOND`, 'SECOND'];\n    } else if (intervalParsed.millisecond && intKeys === 1) {\n      return [`'${intervalParsed.millisecond}' MILLISECOND`, 'MILLISECOND'];\n    }\n\n    throw new Error(`Cannot transform interval expression \"${interval}\" to BigQuery dialect`);\n  }\n\n  public override intervalAndMinimalTimeUnit(interval: string): [string, string] {\n    return this.formatInterval(interval);\n  }\n\n  public newFilter(filter) {\n    return new BigqueryFilter(this, filter);\n  }\n\n  public seriesSql(timeDimension: BaseTimeDimension) {\n    const values = timeDimension.timeSeries().map(\n      ([from, to]) => `select '${from}' f, '${to}' t`\n    ).join(' UNION ALL ');\n    return `SELECT ${this.timeStampCast('dates.f')} date_from, ${this.timeStampCast('dates.t')} date_to FROM (${values}) AS dates`;\n  }\n\n  public timestampFormat() {","sourceCodeStart":116,"sourceCodeEnd":152,"githubUrl":"https://github.com/cube-js/cube/blob/7d981676b36392fec34088b9afab6bdcad40207c/packages/cubejs-schema-compiler/src/adapter/BigqueryQuery.ts#L116-L152","documentation":"BigqueryQuery.formatInterval converts parsed interval expressions into BigQuery's `INTERVAL x unit` syntax. It only handles a fixed set of unit combinations; if the interval's units don't match any supported pattern, it throws this error. This means the interval expression used in a date range/rolling window is not expressible in BigQuery's dialect.","triggerScenarios":"A query uses a time dimension filter or rolling window with an interval like 'quarter', 'half', mixed units (e.g. '1 hour 30 minutes' beyond supported combos), or any unit combo not matching the minute:second / millisecond / single-key branches in formatInterval.","commonSituations":"Developers define rollingWindow or dateRange strings with unsupported units in their data model schemas; migrating queries from Postgres (flexible interval syntax) to BigQuery; typos like '1weak' or pluralization variants that fail interval parsing.","solutions":["Rewrite the interval in a BigQuery-supported unit combination (e.g. use single units like '1 day', '2 hours').","Check the formatInterval branches in BigqueryQuery.ts and align your interval with one of the supported patterns.","For sub-minute precision, use supported 'MINUTE TO SECOND' or millisecond forms.","If the unit is genuinely needed, consider computing it at a coarser unit or contributing a new branch to formatInterval."],"exampleFix":"// before (data model)\nrollingWindow: { trailing: '1 hour 45 minutes' }\n// after\nrollingWindow: { trailing: '105 minutes' }","handlingStrategy":"validation","validationCode":"const ok = /^-?\\d+\\s*(second|minute|hour|day|week|month|year)s?$|^\\d+:\\d+(\\.\\d+)?$|^\\d+\\s*milliseconds?$/i.test(interval);\nif (!ok) throw new Error(`Interval \"${interval}\" unsupported by BigQuery adapter`);","typeGuard":null,"tryCatchPattern":"try { await cube.load({ ...query }) } catch (e) { if (/Cannot transform interval expression/.test(e.message)) { /* rewrite interval or fall back to supported unit */ } else throw e; }","preventionTips":["Use single-unit intervals in rolling windows/date ranges","Test new intervals against BigQuery early in schema dev","Keep a shared constant list of supported interval strings"],"tags":["bigquery","interval","query-dialect","time-dimension"],"backgroundTag":"unsupported-interval-dialect","analyzedSha":"7d981676b36392fec34088b9afab6bdcad40207c","analyzedAt":"2026-09-02T03:45:10.400Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}