MySql时间戳舍入然后以人类可读格式重新格式化

时间:2015-12-28 12:51:30

标签: mysql datetime

我从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

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

  1. 我想了解它在做什么。和
  2. 我需要将其转换回mysql日期/时间Y-M-D H:i:s字符串或UTC时间戳,以便通过javascript进行解析。
  3. 我们假设+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进行解析。

4 个答案:

答案 0 :(得分:0)

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

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

n的结果将是:

  

Mon,28 Dec 2015 12:57:32 GMT

答案 1 :(得分:0)

你是对的, SELECT DATE_FORMAT(DATE(`timestamp`), '%Y-%m-%d'), ... GROUP BY DATE(`timestamp`) 是将UNIX风格的时间戳(自1970-01-01 00:00UTC以来的秒数)舍入到当前UTC午夜的粗略方式。

如果您正在尝试这样做,我建议您尝试使用这种MySQL代码:

{{1}}

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

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

答案 2 :(得分:0)

  1. 它是将时间戳舍入到句点(例如日期)。
  2. DATE_FORMAT(日期(地面(最小(timestamp)/" +期间+")*" +期间+"),'%Y - %m-%d%H:%i:%s')
  3. 如果句点==天考虑仅使用DAY()的MySQL周期舍入。

答案 3 :(得分:0)

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

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

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

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