2015-12-28 2 views
0

У меня есть следующий запрос от Group OHLC-Stockmarket Data into multiple timeframes - Mysql.MySql timestamp rounding, затем переформатирование в человекообразном формате

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

затем он использует операцию ПОЛ, которая сделает его 233231576 затем умножает 86400 снова (я предполагаю, что это для того, округление до день)

В итоге я получаю 20151208166400.

Итак, это 8 декабря 2015 года, но у меня также есть 166400, о котором я понятия не имею, что это такое?

Итак, теперь вторая часть вопроса: как преобразовать это целое число в 2015-12-08 %H:%i:%s или даже временную метку UTC для синтаксического анализа через Javascript.

+0

Я предполагаю, что временная метка кода - это временная метка unix, а не столбец datetime. –

+0

Конечно! Я был здесь действительно глупым. Если вы хотите поместить 'FLOOR (MIN (unix_timestamp (' timestamp'))/"+ period +") * "+ period +" AS timestamp, 'bad отметьте его как правильный ответ – Gravy

ответ

0

Я упомянул проблему в комментарии, но не исправил. Проблема в том, что предлагаемый код предназначен для отметки времени unix, а не для значения datetime.

Это может быть исправлено путем делать соответствующие преобразования

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

Это дает вам гибкость иметь произвольные числа секунд для групп.

0

Преобразование Date объекта в string, в соответствии с универсальным временем:

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

Результатом n будет:

пн, 28 декабря 2015 12:57:32 GMT

0

Вы правы, что FLOOR(timestamp/86400) * 86400 является грубым способом округления отметки времени в стиле UNIX (секунды с тех пор 1970-01-01 00: 00UTC) до полуночи в настоящий момент UTC.

Если это то, что вы пытаетесь сделать, я предлагаю вам попробовать этот вид кода MySQL:

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

Это использует MySQL, построенный в арифметике дат превратить метку времени в полночь.

Но вы должны быть осторожны с одной вещью. Эти метки времени хранятся в формате UTC (f/k/a Среднее время по Гринвичу). Когда вы выполняете арифметику даты с ними или вытаскиваете их из базы данных, чтобы использовать их, они автоматически преобразуются в локальное время в соответствии с настройками часового пояса MySQL.

0
  1. Это округление по времени (например, день).
  2. DATE_FORMAT (ДАТА (ПОЛ (MIN (timestamp)/"+ период +") * "+ период +"), '% Y-% m-% d% H:% I:% s')

Если период == день, рекомендуется использовать только округление периода MySQL по DAY().

Смежные вопросы