【问题标题】:MySql timestamp rounding then reformatting in human readable formatMySql 时间戳舍入然后以人类可读格式重新格式化
【发布时间】:2015-12-28 12:51:30
【问题描述】:

我有来自Group OHLC-Stockmarket Data into multiple timeframes - Mysql 的以下查询。

SELECT
  FLOOR(MIN(`timestamp`)/"+period+")*"+period+" AS timestamp,
  SUM(amount) AS volume,
  SUM(price*amount)/sum(amount) AS wavg_price,
  SUBSTRING_INDEX(MIN(CONCAT(`timestamp`, '_', price)), '_', -1) AS `open`,
  MAX(price) AS high,
  MIN(price) AS low,
  SUBSTRING_INDEX(MAX(CONCAT(`timestamp`, '_', price)), '_', -1) AS `close`
FROM transactions_history -- this table has 3 columns (timestamp, amount, price)
GROUP BY FLOOR(`timestamp`/"+period+")
ORDER BY timestamp

在我的选择语句中,FLOOR(MIN(timestamp)/"+period+")*"+period+" AS timestamp,

  1. 我试图了解它在做什么。和
  2. 我需要将其转换回 mysql 日期/时间 Y-M-D H:i:s 字符串或 UTC 时间戳,以便通过 javascript 进行解析。

假设+period+ 是 86400(一天中的秒数) 假设时间戳是'2015-12-08 20:58:58' 据我所知,它采用时间戳,内部存储为整数并除以 86400。

'2015-12-08 20:58:58' / 86400 = 233231576.4566898000

然后它使用 FLOOR 操作将其变为 233231576 然后再次乘以 86400(我假设这是为了确保四舍五入到当天)

我最终得到20151208166400

那是 2015 年 12 月 8 日,但我也有 166400,我不知道它是什么?

所以现在问题的第二部分是,如何将此整数转换为 2015-12-08 %H:%i:%s 甚至是 UTC 时间戳,以便通过 Javascript 进行解析。

【问题讨论】:

  • 我猜代码中的时间戳是unix时间戳,而不是日期时间列。
  • 当然!我在这里真的很笨。如果您想放置FLOOR(MIN(unix_timestamp(timestamp))/"+period+")*"+period+" AS timestamp,,请将其标记为正确答案

标签: mysql datetime


【解决方案1】:

我在评论中提到了问题,但没有解决。问题是建议的代码是针对 unix 时间戳,而不是日期时间值。

这可以通过适当的转换来解决

SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(MIN(timestamp)) / $period) * $period)

这使您可以灵活地为分组设置任意秒数。

【讨论】:

    【解决方案2】:

    你说得对,FLOOR(timestamp / 86400) * 86400 是一种将 UNIX 样式时间戳(自 1970 年 1 月 1 日 00:00 UTC 以来的秒数)舍入到当前 UTC 午夜的粗略方法。

    如果这就是你想要做的,我建议你试试这种 MySQL 代码:

     SELECT DATE_FORMAT(DATE(`timestamp`), '%Y-%m-%d'),
            ...
      GROUP BY DATE(`timestamp`)
    

    这使用 MySQL 的内置日期算法将时间戳转换为午夜。

    但是你应该注意一件事。这些时间戳都存储在 UTC(f/k/a 格林威治标准时间)中。当您对它们进行日期运算或将它们从数据库中提取出来使用它们时,它们会根据您的 MySQL 时区设置自动转换为本地时间。

    【讨论】:

      【解决方案3】:
      1. 将时间戳四舍五入为周期(例如天)。
      2. DATE_FORMAT( DATE( FLOOR(MIN(timestamp)/"+period+")*"+period+" ) , '%Y-%m-%d %H:%i:%s' )

      如果 period==day 考虑仅使用 MySQL 的 DAY() 周期四舍五入。

      【讨论】:

        【解决方案4】:

        根据通用时间将Date 对象转换为string

        var d = new Date();
        var n = d.toUTCString();
        

        n 的结果将是:

        格林威治标准时间 2015 年 12 月 28 日星期一 12:57:32

        【讨论】:

          猜你喜欢
          • 2011-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-03
          • 1970-01-01
          • 1970-01-01
          • 2021-12-19
          • 2020-01-11
          相关资源
          最近更新 更多