Ниже для стандартного SQL BigQuery и (я думаю) покрывает большинство сумасшедших изменений представлений даты, используя moment.js библиотеку через BigQuery UDF с внешними библиотеками.
Примечание: вам нужно загрузить moment.js
в your_bucket
на GCS
#standardSQL
CREATE TEMPORARY FUNCTION PARSE_DATE_CUSTOM(format_string STRING, date_string STRING )
RETURNS STRING
LANGUAGE js AS """
return moment(date_string).format(format_string);
"""
OPTIONS (
library="gs://your_bucket/moment.js"
);
SELECT
JSON_EXTRACT_SCALAR(g.p_dataforanalytics, '$.birthday') birthday_in_json,
PARSE_DATE_CUSTOM('YYYY-MM-DD', JSON_EXTRACT_SCALAR(g.p_dataforanalytics, '$.birthday')) birthday
FROM `project.dataset.table` g
Как вы можете видеть - здесь представлена новая пользовательская функция PARSE_DATE_CUSTOM(format_string STRING, date_string STRING )
, которая принимает любыестрока, представляющая дату и формат, в котором вы хотите получить конечный результат. Поддерживаемые форматы: здесь
Вы можете протестировать, поиграть с выше, используя фиктивные данные, как в упрощенном примере ниже
#standardSQL
CREATE TEMPORARY FUNCTION PARSE_DATE_CUSTOM(format_string STRING, date_string STRING )
RETURNS STRING
LANGUAGE js AS """
return moment(date_string).format(format_string);
"""
OPTIONS (
library="gs://your_bucket/moment.js"
);
WITH `project.dataset.table` AS (
SELECT '{"birthday":"2000-12-31"}' p_dataforanalytics UNION ALL
SELECT '{"birthday":"2000-15-31"}' UNION ALL
SELECT '{"birthday":"12/31/2000"}' UNION ALL
SELECT '{"birthday":"31 Dec 2000"}' UNION ALL
SELECT '{"birthday":"Around 2000, Dec 31"}'
)
SELECT
JSON_EXTRACT_SCALAR(g.p_dataforanalytics, '$.birthday') birthday_in_json,
PARSE_DATE_CUSTOM('YYYY-MM-DD', JSON_EXTRACT_SCALAR(g.p_dataforanalytics, '$.birthday')) birthday
FROM `project.dataset.table` g
с результатом
Row birthday_in_json birthday
1 2000-12-31 2000-12-31
2 2000-15-31 Invalid date
3 12/31/2000 2000-12-31
4 31 Dec 2000 2000-12-31
5 Around 2000, Dec 31 2000-12-31