{"record":{"id":"437127f01e0f06db","repo":"cube-js/cube","slug":"relative-date-strings-are-only-supported-when-val","errorCode":null,"errorMessage":"Relative-date strings are only supported when `values` has a single element for operator `${filter.operator}`. Pass an absolute two-element [start, end] pair, or a single relative string like [\"last 2 weeks\"]. Got: ${JSON.stringify(filter.values)}","messagePattern":"Relative-date strings are only supported when `values` has a single element for operator `(.+?)`\\. Pass an absolute two-element \\[start, end\\] pair, or a single relative string like \\[\"last 2 weeks\"\\]\\. Got: (.+?)","errorType":"validation","errorClass":"UserError","httpStatus":null,"severity":"error","filePath":"packages/cubejs-api-gateway/src/query.js","lineNumber":318,"sourceCode":"// with the same relative-date support that `timeDimensions.dateRange` has.\n// Reuses resolveDateRange so both paths produce identical output. Non-date\n// operators and already-absolute values pass through unchanged.\nexport const normalizeDateFilterValues = (filter, timezone) => {\n  if (!filter || !filter.operator || !Array.isArray(filter.values)) {\n    return filter;\n  }\n\n  // Fail fast at the gateway if a range operator is given a multi-element\n  // `values` array that contains a relative-date string. This shape falls\n  // through the resolver (which only handles single-element values) and\n  // would otherwise error deep in query execution with an opaque message. This\n  // surfaces the failure at the API boundary instead.\n  if (\n    (DATE_RANGE_OPERATORS.includes(filter.operator) || filter.operator === 'onTheDate') &&\n    filter.values.length > 1 &&\n    filter.values.some(v => typeof v === 'string' && !AbsoluteDateTimeRegex.test(v))\n  ) {\n    throw new UserError(\n      `Relative-date strings are only supported when \\`values\\` has a single element for operator \\`${filter.operator}\\`. Pass an absolute two-element [start, end] pair, or a single relative string like [\"last 2 weeks\"]. Got: ${JSON.stringify(filter.values)}`\n    );\n  }\n\n  if (filter.values.length !== 1) {\n    return filter;\n  }\n\n  const value = filter.values[0];\n  if (typeof value !== 'string') {\n    return filter;\n  }\n\n  if (DATE_RANGE_OPERATORS.includes(filter.operator) || filter.operator === 'onTheDate') {\n    // onTheDate resolves to a two-sided range: legacy onTheDateWhere reads\n    // values[0]/values[1], and Tesseract maps onTheDate to InDateRange which\n    // requires exactly 2 values.\n    return { ...filter, values: resolveDateRange(value, timezone) };","sourceCodeStart":300,"sourceCodeEnd":336,"githubUrl":"https://github.com/cube-js/cube/blob/7d981676b36392fec34088b9afab6bdcad40207c/packages/cubejs-api-gateway/src/query.js#L300-L336","documentation":"Error \"Relative-date strings are only supported when `values` has a single element for operator `${filter.operator}`. Pass an absolute two-element [start, end] pair, or a single relative string like [\"last 2 weeks\"]. Got: ${JSON.stringify(filter.values)}\" thrown in cube-js/cube.","triggerScenarios":"Thrown at packages/cubejs-api-gateway/src/query.js:318 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Pass an absolute two-element [start, end] date range array instead of mixing relative strings with multiple values.","Collapse to a single relative-date string such as [\"last 2 weeks\"] so the resolver can expand it.","Split into two separate filters if both a relative start and an absolute end are needed."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"7d981676b36392fec34088b9afab6bdcad40207c","analyzedAt":"2026-09-02T03:45:10.400Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}