Интервал Tstamp всегда начинается в полночь - PullRequest
0 голосов
/ 16 октября 2018

У меня есть этот запрос, который показывает мне интервал в 1 час.У меня проблема в том, что когда он установлен на 1 час, он показывает идеальные данные, которые начинаются с 12:00 до 11:00

SELECT 

FROM_UNIXTIME(UNIX_TIMESTAMP(t_stamp) - MOD(UNIX_TIMESTAMP(t_stamp), 3600)) as Tstamp,
Col1,
Col2

FROM table


WHERE DATE(t_stamp) BETWEEN '2018-10-15' AND '2018-10-15'


GROUP BY Tstamp

ORDER BY t_stamp ASC

Выходные данные выглядят примерно так

Tstamp                  Col1    Col2
2018-10-15 00:00:00     73.43   72.12
2018-10-15 01:00:00     73.29   71.96
2018-10-15 02:00:00     73.43   72.21
.
.
.
.
.
2018-10-15 16:00:00     74.24   72.85
2018-10-15 17:00:00     74.37   72.85
2018-10-15 18:00:00     74.20   72.64
2018-10-15 19:00:00     74.01   72.42
2018-10-15 20:00:00     73.80   72.42
2018-10-15 21:00:00     73.73   72.34
2018-10-15 22:00:00     73.59   72.13
2018-10-15 23:00:00     73.51   72.12

НоКогда я устанавливаю интервал в 3 часа или 8 часов, он не начинается в полночь, если, например, выбранная дата равна 2018-10-15, а интервал установлен в 3 часа, он начинается в 2018-10-14 11:00:00 вместо 2018-10-15 12:00 AM

SELECT 

FROM_UNIXTIME(UNIX_TIMESTAMP(t_stamp) - MOD(UNIX_TIMESTAMP(t_stamp), 10800)) as Tstamp,
Col1,
Col2

FROM table


WHERE DATE(t_stamp) BETWEEN '2018-10-15' AND '2018-10-15'


GROUP BY Tstamp

ORDER BY t_stamp ASC

Это вывод, когда интервал составляет 3 часа

Tstamp                  Col1    Col2
2018-10-14 23:00:00     73.43   72.12
2018-10-15 02:00:00     73.43   72.21
2018-10-15 05:00:00     73.73   72.42
2018-10-15 08:00:00     73.29   71.96
2018-10-15 11:00:00     73.36   72.34
2018-10-15 14:00:00     73.98   72.64
2018-10-15 17:00:00     74.37   72.85
2018-10-15 20:00:00     73.80   72.42
2018-10-15 23:00:00     73.51   72.12

Я надеялся на такой вывод, когдаинтервал составляет 3 часа и 8 часов, где, если выбранная дата - 2018-10-15, она начнется в полночь 12 часов, а не днем ​​раньше.

Tstamp                  Col1    Col2
2018-10-15 00:00:00     73.43   72.21
2018-10-15 03:00:00     73.72   72.99
2018-10-15 06:00:00     73.34   72.12
2018-10-15 09:00:00     73.43   72.77
2018-10-15 12:00:00     73.29   72.42
2018-10-15 15:00:00     74.15   72.76
2018-10-15 18:00:00     74.20   72.64
2018-10-15 21:00:00     73.73   72.34
.
.
.

Ваша помощь будет принята с благодарностью,Спасибо

Структура и пример данных

CREATE TABLE `table` (
  `Col1` float DEFAULT NULL,
  `Col2` float DEFAULT NULL,
  `t_stamp` datetime DEFAULT NULL,
  KEY `tablet_stampndx` (`t_stamp`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `table`
(`Col1`,
`Col2`,
`t_stamp`)
VALUES
('73.43','72.12','2018-10-15 00:00:00'),
('73.29','71.96','2018-10-15 01:00:00'),
('73.43','72.21','2018-10-15 02:00:00'),
('73.72','72.99','2018-10-15 03:00:00'),
('73.80','72.55','2018-10-15 04:00:00'),
('73.73','72.42','2018-10-15 05:00:00'),
('73.34','72.12','2018-10-15 06:00:00'),
('73.94','73.20','2018-10-15 07:00:00'),
('73.29','71.96','2018-10-15 08:00:00'),
('73.43','72.77','2018-10-15 09:00:00'),
('73.43','72.12','2018-10-15 10:00:00'),
('73.36','72.34','2018-10-15 11:00:00'),
('73.29','72.42','2018-10-15 12:00:00'),
('73.51','72.34','2018-10-15 13:00:00'),
('73.98','72.64','2018-10-15 14:00:00'),
('74.15','72.76','2018-10-15 15:00:00'),
('74.24','72.85','2018-10-15 16:00:00'),
('74.37','72.85','2018-10-15 17:00:00'),
('74.20','72.64','2018-10-15 18:00:00'),
('74.01','72.42','2018-10-15 19:00:00'),
('73.80','72.42','2018-10-15 20:00:00'),
('73.73','72.34','2018-10-15 21:00:00'),
('73.59','72.13','2018-10-15 22:00:00'),
('73.51','72.12','2018-10-15 23:00:00')

До сих пор я пытался использовать функцию DATE_SUB, но она не дала мне того результата, который я хотел.Я выбрал 10-15 на интервале дат, но он показывает мне данные с 10-14, что на самом деле не то, что я хотел увидеть

SELECT 

t_stamp,
Col1,
Col2


FROM table

WHERE t_stamp BETWEEN DATE_SUB('2018-10-15 00:00:00', INTERVAL 3 HOUR) 
    AND DATE_ADD('2018-10-15 23:59:59', INTERVAL 3 HOUR)

GROUP BY t_stamp
ORDER BY t_stamp ASC


2018-10-14 21:02:17 73.50   72.21
2018-10-14 21:07:17 73.51   72.21
2018-10-14 21:12:17 73.50   72.21
2018-10-14 21:17:17 73.50   72.19
2018-10-14 21:22:17 73.50   72.21
2018-10-14 21:27:17 73.50   72.21

1 Ответ

0 голосов
/ 17 октября 2018

Это то, что вы ищете?

SELECT DISTINCT SEC_TO_TIME((FLOOR(TIME_TO_SEC(t_stamp)/10800)*10800))x FROM `table`;
...