如何在BigQuery中获取EDT/EST等时区缩写而非UTC±X格式?
在BigQuery中显示EDT/EST这类时区缩写的实现方案
BigQuery的FORMAT_TIMESTAMP函数默认用%Z占位符输出的是UTC偏移格式(如UTC-7),而非EDT、EST这类夏令时/标准时的缩写。要实现目标格式,可通过以下两种方式处理:
方法一:自定义时区映射+夏令时判断
创建包含目标时区标准时、夏令时缩写的映射表,结合EXTRACT(DST)函数判断当前时间是否处于夏令时,最终拼接出目标格式:
WITH time_zone_mappings AS ( SELECT 'America/New_York' AS tz_id, 'EST' AS std_abbr, 'EDT' AS dst_abbr UNION ALL SELECT 'America/Los_Angeles' AS tz_id, 'PST' AS std_abbr, 'PDT' AS dst_abbr -- 按需添加其他时区的映射关系 ) SELECT CONCAT( FORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', CURRENT_TIMESTAMP(), t.tz_id), ' ', CASE WHEN EXTRACT(DST FROM CURRENT_TIMESTAMP() AT TIME ZONE t.tz_id) THEN t.dst_abbr ELSE t.std_abbr END ) AS timezoned FROM time_zone_mappings t WHERE t.tz_id = 'America/Los_Angeles';
该方法的核心是通过EXTRACT(DST FROM ...)检测目标时区下当前时间是否启用夏令时,再匹配对应的时区缩写,可靠性高,适合多时区场景扩展。
方法二:利用预定义格式字符串截取缩写(仅限特定场景)
借助%c格式符输出包含时区缩写的完整时间字符串,再通过字符串截取提取缩写。这种方式依赖BigQuery对%c格式的输出规则,稳定性略差:
SELECT CONCAT( FORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', CURRENT_TIMESTAMP(), 'America/Los_Angeles'), ' ', SUBSTR(PARSE_TIMESTAMP('%c', CURRENT_TIMESTAMP(), 'America/Los_Angeles'), -3) ) AS timezoned;
注:%c格式会输出类似Fri Oct 28 00:00:26 2022 PDT的字符串,截取最后3位即可得到时区缩写,但部分时区可能存在缩写歧义,不推荐作为通用解决方案。
内容的提问来源于stack exchange,提问作者Dmytro Pavlov
相关产品推荐
相关产品推荐

