我希望将它们转换为正确的日期时间,以便我可以执行一些操作,例如计算以毫秒为单位的时间差等。
以下是 BigQuery 标准 SQL,理想情况下应该适用于您介绍的示例
#standardSQL
SELECT startTime, endTime,
TIMESTAMP_DIFF(
PARSE_TIMESTAMP('%a %b %d %H:%M:%S %Z %Y', endTime),
PARSE_TIMESTAMP('%a %b %d %H:%M:%S %Z %Y', startTime),
MILLISECOND
) diff_in_ms
FROM `yourproject.yourdataset.yourtable`
您可以使用下面的虚拟数据测试/玩它
#standardSQL
WITH `yourproject.yourdataset.yourtable` AS (
SELECT 'Wed Dec 20 02:54:35 GMT 2017' startTime, 'Wed Dec 20 02:54:36 GMT 2017' endTime
)
SELECT startTime, endTime,
TIMESTAMP_DIFF(
PARSE_TIMESTAMP('%a %b %d %H:%M:%S %Z %Y', endTime),
PARSE_TIMESTAMP('%a %b %d %H:%M:%S %Z %Y', startTime),
MILLISECOND
) diff_in_ms
FROM `yourproject.yourdataset.yourtable`
我也完全可以删除时区
看起来你对 PST 有问题 - 你可以尝试在下面消除时区
#standardSQL
CREATE TEMP FUNCTION removeTZ(val STRING) AS (
REGEXP_REPLACE(val, r'(\w+ \w+ \d{2} \d{2}:\d{2}:\d{2} )\w+ (\d{4})', '\\1\\2')
);
SELECT startTime, endTime,
TIMESTAMP_DIFF(
PARSE_TIMESTAMP('%a %b %d %H:%M:%S %Y', removeTZ(endTime)),
PARSE_TIMESTAMP('%a %b %d %H:%M:%S %Y', removeTZ(startTime)),
MILLISECOND
) diff_in_ms
FROM `yourproject.yourdataset.yourtable`
您仍然可以使用相同的虚拟数据进行测试/玩
#standardSQL
CREATE TEMP FUNCTION removeTZ(val STRING) AS (
REGEXP_REPLACE(val, r'(\w+ \w+ \d{2} \d{2}:\d{2}:\d{2} )\w+ (\d{4})', '\\1\\2')
);
WITH `yourproject.yourdataset.yourtable` AS (
SELECT 'Wed Dec 20 02:54:35 GMT 2017' startTime, 'Wed Dec 20 02:54:36 GMT 2017' endTime
)
SELECT startTime, endTime,
TIMESTAMP_DIFF(
PARSE_TIMESTAMP('%a %b %d %H:%M:%S %Y', removeTZ(endTime)),
PARSE_TIMESTAMP('%a %b %d %H:%M:%S %Y', removeTZ(startTime)),
MILLISECOND
) diff_in_ms
FROM `yourproject.yourdataset.yourtable`
上述两个查询都返回相同的结果(当然)
startTime endTime diff_in_ms
Wed Dec 20 02:54:35 GMT 2017 Wed Dec 20 02:54:36 GMT 2017 1000
注意:第二种解决方案(消除时区)不依赖于预定义的位置/长度,因为时区可以有不同的长度。相反,它使用正则表达式来识别时区并将其删除