【问题标题】:How to convert an integer with or without a negative symbol to a timezone offset for CONVERT_TZ?如何将带或不带负号的整数转换为 CONVERT_TZ 的时区偏移量?
【发布时间】:2020-10-06 13:59:56
【问题描述】:

因此,在数据库表中,我们将地点的时区偏移量存储为一个整数,在其前面带有或不带有负号(- 或破折号),在 varchar(3) 列中,如下所示:

-5(抽动显然不是价值的一部分)

这需要在 from_tz 参数中的 CONVERT_TZ 函数中使用...它仅适用于字符串时区或格式的偏移量,如 -05:00,我还没有看到如何做。

function definition: CONVERT_TZ(dt, from_tz, to_tz)

我用另一种语言构建一些东西来将 -5 转换为字符串时区而不是将其传递给 from_tz 是不可行的,因为由于获取和比较,它必须在 SQL 中,而且我们没有时间修复数据值和表及其跨服务器的实现。

我已经尝试了各种组合的 REGEX、SIGN、SUBSTRING……但到目前为止,它们还没有为时区 0 或 -3 或 5 提供一致的解决方案(并且强制似乎不起作用),并且当 CONVERT_TZ 无法比较时,它返回 NULL,破坏任何依赖它的东西。

【问题讨论】:

    标签: mysql datetime timezone timezone-offset


    【解决方案1】:

    这是 SQL 字符串黑客的工作。

    SET @v := +4;
    SELECT CONVERT_TZ(NOW(), 
                      CONCAT( IF(@v < 0 , '-', '+'),
                              RIGHT(CONCAT('00', CAST(ABS(@v) AS char(2)), ':00'), 5)),
                      'America/Halifax')
    

    CONCAT() 表达式将任何整数 n 转换为0n:00,然后将+- 置于前面。它不漂亮,但很有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 2012-08-02
      • 2016-05-07
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多