【问题标题】:Remove UTC from a TIMESTAMP field in SQL(BigQuery)从 SQL(BigQuery) 中的 TIMESTAMP 字段中删除 UTC
【发布时间】:2021-08-27 02:10:40
【问题描述】:

我已经能够使用以下方法将 UTC 中的 TIMESTAMP 字段转换为 CST:

SELECT  
    TIMESTAMP(started_at) AS UTC,  
    TIMESTAMP_SUB(TIMESTAMP (started_at), INTERVAL 5 HOUR) AS CST

这会返回:

ROW UTC CST
1 2020-05-17 13:07:22 UTC 2020-05-17 08:07:22 UTC

第二个 TIMESTAMP 显示正确的日期和时间,但仍显示 UTC。用“CST”替换“UTC”或完全删除“UTC”的最简单方法是什么,因为我不需要该字段本身的名称?

【问题讨论】:

    标签: sql datetime timestamp


    【解决方案1】:

    您可以使用内联的普通 sql 替换函数

    select replace(TIMESTAMP_SUB(TIMESTAMP (started_at), INTERVAL 5 HOUR), 'UTC','') AS CST
    

    以上内容在您的表达式结果(在您的问题中提供)搜索'UTC',并将其替换为无''。如您所述,您也可以将其替换为 'CST'

    强制性警告:我相信只要遵守夏令时,您的查询只会在半年内正确?您可能想查看sys.time_zone_infoits reference on the MSDN

    【讨论】:

    • 感谢您的协助。我意识到这仅适用于美国处于标准时间的时间,但我正在研究的顶点项目案例研究实际上更关注自行车租赁的持续时间,并倾向于按星期几跟踪租赁。但是,我会确保我注意到没有执行到 DST 的转换,并在下一次“真实”分析时牢记这一点。:)
    • 我现在在插入代码时收到此错误:对于参数类型的函数 REPLACE 没有匹配的签名:TIMESTAMP、STRING、STRING。支持的签名:REPLACE(STRING, STRING, STRING);在 [2:5] 处替换(字节、字节、字节)。我错过了什么?
    【解决方案2】:

    我的建议是将时间戳转换为 datetime 本地值:

    select datetime(started_at, 'America/Chicago') as started_at_cst
    

    请注意,时区不存储在数据值中。相反,这会对字符串中的值进行编码。

    如果要包含时区值,我发现最好的方法是使用字符串(argghh!)。下面构造一个字符串:

     format_timestamp('%F %X%z', started_at, 'America/Chicago') as started_at_str
    

    可以很容易地转换为时间戳以进行日期/时间计算:

    timestamp(started_at_str)
    

    【讨论】:

    • 好的。无需为此包含时区值。我只想能够在正确的时区计算正确的星期几,并且即使 TIMESTAMP 已更新,也不会因显示错误的时区标签而分心。欣赏答案。
    • @KevinKish 。 . . TIMETSTAMPs 没有“错误”的时区。它们始终以 UTC 表示。如果将值存储为字符串,则可以解决此问题。
    • 啊。所以这可能解释了为什么我找不到我正在搜索的解决方案......通过尝试转换 TIMESTAMP 本身。现在真的很高兴知道。我得去把冰块放在我头上撞桌子的地方;)
    • @KevinKish 。 . .我描述了我想出的解决方案。
    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多