{"record":{"id":"38f7c07818fe472d","repo":"getredash/redash","slug":"unknown-date-time-format-in-results-38f7c0","errorCode":null,"errorMessage":"Unknown date/time format in results: '{}'","messagePattern":"Unknown date/time format in results: '(.+?)'","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"redash/query_runner/google_analytics4.py","lineNumber":52,"sourceCode":"    DATETIME=TYPE_DATETIME,\n)\n\nga_report_endpoint = \"https://analyticsdata.googleapis.com/v1beta/properties/{propertyId}:runReport\"\nga_metadata_endpoint = \"https://analyticsdata.googleapis.com/v1beta/properties/{propertyId}/metadata\"\n\n\ndef format_column_value(column_name, value, columns):\n    column_type = [col for col in columns if col[\"name\"] == column_name][0][\"type\"]\n\n    if column_type == TYPE_DATE:\n        value = datetime.datetime.strptime(value, \"%Y%m%d\")\n    elif column_type == TYPE_DATETIME:\n        if len(value) == 10:\n            value = datetime.datetime.strptime(value, \"%Y%m%d%H\")\n        elif len(value) == 12:\n            value = datetime.datetime.strptime(value, \"%Y%m%d%H%M\")\n        else:\n            raise Exception(\"Unknown date/time format in results: '{}'\".format(value))\n\n    return value\n\n\ndef get_formatted_column_json(column_name):\n    data_type = None\n\n    if column_name == \"date\":\n        data_type = \"DATE\"\n    elif column_name == \"dateHour\":\n        data_type = \"DATETIME\"\n\n    result = {\n        \"name\": column_name,\n        \"friendly_name\": column_name,\n        \"type\": types_conv.get(data_type, \"string\"),\n    }\n","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/getredash/redash/blob/ca79fe988d81cdac9675b412f3dfcab107bc1fbc/redash/query_runner/google_analytics4.py#L34-L70","documentation":"GA4 runner's format_column_value normalizes typed columns; for TYPE_DATETIME it accepts exactly 10-char (YYYYMMDDHH) or 12-char (YYYYMMDDHHMM) values, otherwise raises 'Unknown date/time format in results'. It fires during parsing of every row, including in test_connection-adjacent code paths.","triggerScenarios":"A GA4 dimension typed as datetime whose value is 'YYYYMMDD' (8 chars), empty, None, or a new granularity like dateHourMinute with different length; also raw values not zero-padded.","commonSituations":"Using ga:date (8 chars) where the type inference marks the column datetime, API returning nulls in sparse rows, or newer GA4 dimensions with unrecognized formats.","solutions":["Change the dimension to dateHour/dateHourMinute so the value matches a supported length","Pre-check your values: ensure 10- or 12-char zero-padded strings before relying on datetime typing","File/upgrade Redash so format_column_value handles 'YYYYMMDD' and None"],"exampleFix":"// before\n{\"dimensions\": [{\"name\": \"date\"}]}\n// after\n{\"dimensions\": [{\"name\": \"dateHour\"}]}","handlingStrategy":"validation","validationCode":"import re\n\ndef is_supported_dt(v) -> bool:\n    if not isinstance(v, str):\n        return False\n    return bool(re.fullmatch(r\"\\d{10}|\\d{12}\", v))","typeGuard":null,"tryCatchPattern":"try:\n    rows = runner.run_query(q, user)\nexcept Exception as e:\n    if \"Unknown date/time format\" in str(e):\n        change_column_type_to_date_or_string_and_refresh()","preventionTips":["Prefer dateHour/dateHourMinute dimensions for datetime columns","Don't force datetime typing on ga:date","Handle nulls in sparse GA4 rows"],"tags":["google-analytics-4","date-parsing","datetime"],"backgroundTag":"date-parse-failure","analyzedSha":"ca79fe988d81cdac9675b412f3dfcab107bc1fbc","analyzedAt":"2026-08-28T18:32:34.637Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}