cube-js/cube · error · Error

Cannot transform interval expression "${interval}" to BigQue

Error message

Cannot transform interval expression "${interval}" to BigQuery dialect

What it means

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.

Source

Thrown at packages/cubejs-schema-compiler/src/adapter/BigqueryQuery.ts:134

    } else if (intervalParsed.day && intKeys === 1) {
      return [`${intervalParsed.day} DAY`, 'DAY'];
    } else if (intervalParsed.day && intervalParsed.hour && intKeys === 2) {
      return [`'${intervalParsed.day} ${intervalParsed.hour}' DAY TO HOUR`, 'HOUR'];
    } else if (intervalParsed.day && intervalParsed.hour && intervalParsed.minute && intKeys === 3) {
      return [`'${intervalParsed.day} ${intervalParsed.hour}:${intervalParsed.minute}' DAY TO MINUTE`, 'MINUTE'];
    } else if (intervalParsed.day && intervalParsed.hour && intervalParsed.minute && intervalParsed.second && intKeys === 4) {
      return [`'${intervalParsed.day} ${intervalParsed.hour}:${intervalParsed.minute}:${intervalParsed.second}' DAY TO SECOND`, 'SECOND'];
    } else if (intervalParsed.hour && intervalParsed.minute && intKeys === 2) {
      return [`'${intervalParsed.hour}:${intervalParsed.minute}' HOUR TO MINUTE`, 'MINUTE'];
    } else if (intervalParsed.hour && intervalParsed.minute && intervalParsed.second && intKeys === 3) {
      return [`'${intervalParsed.hour}:${intervalParsed.minute}:${intervalParsed.second}' HOUR TO SECOND`, 'SECOND'];
    } else if (intervalParsed.minute && intervalParsed.second && intKeys === 2) {
      return [`'${intervalParsed.minute}:${intervalParsed.second}' MINUTE TO SECOND`, 'SECOND'];
    } else if (intervalParsed.millisecond && intKeys === 1) {
      return [`'${intervalParsed.millisecond}' MILLISECOND`, 'MILLISECOND'];
    }

    throw new Error(`Cannot transform interval expression "${interval}" to BigQuery dialect`);
  }

  public override intervalAndMinimalTimeUnit(interval: string): [string, string] {
    return this.formatInterval(interval);
  }

  public newFilter(filter) {
    return new BigqueryFilter(this, filter);
  }

  public seriesSql(timeDimension: BaseTimeDimension) {
    const values = timeDimension.timeSeries().map(
      ([from, to]) => `select '${from}' f, '${to}' t`
    ).join(' UNION ALL ');
    return `SELECT ${this.timeStampCast('dates.f')} date_from, ${this.timeStampCast('dates.t')} date_to FROM (${values}) AS dates`;
  }

  public timestampFormat() {

View on GitHub (pinned to 7d981676b3)

Solutions

  1. Rewrite the interval in a BigQuery-supported unit combination (e.g. use single units like '1 day', '2 hours').
  2. Check the formatInterval branches in BigqueryQuery.ts and align your interval with one of the supported patterns.
  3. For sub-minute precision, use supported 'MINUTE TO SECOND' or millisecond forms.
  4. If the unit is genuinely needed, consider computing it at a coarser unit or contributing a new branch to formatInterval.

Example fix

// before (data model)
rollingWindow: { trailing: '1 hour 45 minutes' }
// after
rollingWindow: { trailing: '105 minutes' }
Defensive patterns

Strategy: validation

Validate before calling

const ok = /^-?\d+\s*(second|minute|hour|day|week|month|year)s?$|^\d+:\d+(\.\d+)?$|^\d+\s*milliseconds?$/i.test(interval);
if (!ok) throw new Error(`Interval "${interval}" unsupported by BigQuery adapter`);

Try / catch

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; }

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of cube-js/cube@7d981676b3 (2026-09-02). Data as JSON: /api/errors/fac652126ebb03df. Report an issue: GitHub.