以下是 BigQuery 标准 SQL 和(我认为)通过使用 moment.js 库和 BigQuery UDF 和外部库来涵盖大多数疯狂的日期表示变化。
注意:你需要将moment.js上传到GCS上的your_bucket
#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 ) - 它接受表示您希望最终输出的日期和格式的任何字符串。支持的格式是 here
您可以使用虚拟数据进行测试,使用上面的简化示例,如下面的简化示例
#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