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
- 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.
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
- 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
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
- Cannot transform interval expression "${interval}" to CubeSt
- Unload is not configured
- ${result.status.errorResult.message ? result.status.errorRes
- BigQuery job timeout reached ${this.options.pollTimeout}ms
- Cannot transform interval expression "${interval}" to Databr
AI-assisted analysis of cube-js/cube@7d981676b3 (2026-09-02).
Data as JSON: /api/errors/fac652126ebb03df.
Report an issue: GitHub.