【问题标题】:Convert BigInt timestamp to a real Date with row aggregation and operations in mySQL使用 mySQL 中的行聚合和操作将 BigInt 时间戳转换为真实日期
【发布时间】:2013-11-04 07:12:37
【问题描述】:

我有一个查询,它采用最后更新日期(时间戳,但作为 bigint(20) 列),如下所示:

SELECT a.id_workorder, MAX(b.update_date) AS udpate_date
FROM main_log a, 
(
    SELECT MAX(log_date) AS update_date, log_id 
    FROM log_a
    GROUP BY log_id
    UNION
    SELECT MAX(log_date) AS update_date, log_id 
    FROM log_b
    GROUP BY log_id
)b
WHERE a.id_log = b.log_id
GROUP BY b.log_id

它返回任何类型日志(a 或 b)的最后更新日期(unix 时间戳作为 bigint(20)):

id          last update
-------------------------
1001        1376750476349
1002        1376753690861
1003        1378122801986
1004        1377764414858
1005        1377847226096
...

现在我想以日期格式格式化返回,虽然我可以像这样使用FROM_UNIXTIME 格式化外部时间戳:

SELECT 
    a.id_workorder, 
    FROM_UNIXTIME(MAX(b.update_date)) AS udpate_date
FROM main_log a, 
(
    SELECT MAX(log_date) AS update_date, log_id 
    FROM log_a
    GROUP BY log_id
    UNION
    SELECT MAX(log_date) AS update_date, log_id 
    FROM log_b
    GROUP BY log_id
)b
WHERE a.id_log = b.log_id
GROUP BY b.log_id

但它给了

id          last update
-------------------------
1001        null
1002        null
1003        null
1004        null
1005        null
...

我也尝试将转换放在内部查询中,但它是一样的。

我还尝试在 SO、mySQL 文档和 Google 上找到答案,但没有找到为什么在我创建 group by 时转换不起作用。

【问题讨论】:

    标签: mysql datetime group-by timestamp type-conversion


    【解决方案1】:
      SET @DateFormat ='%m/%d/%Y';
      SET @DateTimeFormat ='%m/%d/%Y %h:%i %p';
    
      SELECT DATE_FORMAT(timestamp(NOW()+0), @DateFormat);
      SELECT DATE_FORMAT(timestamp(NOW()+0), @DateTimeFormat);
    

    您可以使用上述代码将 bigint 时间戳更改为实际日期或日期时间。

    【讨论】:

      【解决方案2】:

      您的时间戳以毫秒为单位尝试:

      SELECT a.id_workorder, 
      FROM_UNIXTIME(MAX(b.update_date/1000)) AS udpate_date
      FROM main_log a, ...
      

      (即将时间除以 1000 得到秒数)

      mysql> select FROM_UNIXTIME(1376750476349);
      +------------------------------+
      | FROM_UNIXTIME(1376750476349) |
      +------------------------------+
      | NULL                         |
      +------------------------------+
      1 row in set (0.06 sec)
      
      mysql> select FROM_UNIXTIME(1376750476349/1000);
      +-----------------------------------+
      | FROM_UNIXTIME(1376750476349/1000) |
      +-----------------------------------+
      | 2013-08-17 15:41:16               |
      +-----------------------------------+
      1 row in set (0.02 sec)
      
      mysql>
      

      【讨论】:

      • 哇,多么愚蠢...非常感谢您注意到毫秒(即使我怀疑他们的系统是否真的需要毫秒精度)。无论如何,除以 1000 效果很好。
      猜你喜欢
      • 2014-03-09
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 2023-03-24
      • 2016-11-26
      • 1970-01-01
      相关资源
      最近更新 更多