【问题标题】:FROM_UNIXTIME returning one extra hourFROM_UNIXTIME 返回一小时
【发布时间】:2018-03-08 15:39:15
【问题描述】:

我有一个非常简单的需求: 将一些毫秒值转换为“##:##:##”(小时/分钟/秒)格式。

看来 FROM_UNIXTIME 可以完成这项工作,所以我使用了它,但是...

SELECT 
    FROM_UNIXTIME(42, "%H:%i:%s") AS pony
    ,FROM_UNIXTIME(3702, "%H:%i:%s") AS unicorn

返回

pony       unicorn
01:00:42   02:01:42

由于此函数中没有设置时区,我不知道如何删除这个额外的 (wtf) 小时。
删除 3600 秒会产生一个负值,即输出 NULL

我想我应该使用另一种方式,但如果我必须使用六个转换,我也可以手动进行......没有什么简单高效


我没有确切的 MySQL 版本,但无论如何我需要最低限度的可移植性。可以使用的东西,比如 MySQL 5.x 我需要手动计算吗?


编辑: 选择了一个丑陋但有效的“解决方案”:

CONCAT(
  LPAD(FLOOR((my_column/1000) / 3600), 2, '0'), ':',
  LPAD(FLOOR(((my_column/1000) % 3600) / 60), 2, '0'), ':',
  LPAD(FLOOR((my_column/1000) % 60), 2, '0')) AS time

具有所需格式的输出。 例如“03:12:04”或“123:00:44”

【问题讨论】:

  • 我猜那是您当地的时区。也许使用SET time_zone='UTC'; 会有所帮助,请参阅stackoverflow.com/q/18276768/5520354
  • @C14L 是的,我确定这是因为那些 ******* 夏令时(我是 FR),但现在,尝试仅设置时区...变成了我所有的结果为 null。此外,“UTC”似乎不是有效值(产生错误),必须使用“+00:00”。它应该解释空值吗?

标签: mysql


【解决方案1】:

我不得不选择一个丑陋但有效的“解决方案”:

CONCAT(
  LPAD(FLOOR((my_column/1000) / 3600), 2, '0'), ':',
  LPAD(FLOOR(((my_column/1000) % 3600) / 60), 2, '0'), ':',
  LPAD(FLOOR((my_column/1000) % 60), 2, '0')) AS time

具有所需格式的输出。示例“03:12:04”或“123:00:44

C14L 的评论应该是更好的选择,但它只会让事情变得更糟:/

如果您有可靠且易于使用的东西,请发布答案。
不得不手动进行这样的计算对我来说没有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2019-03-09
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多