在MySQL中,如何获取此查询返回的时间的中间值?
我有以下疑问 从数据库返回以下时间 如何获取此查询返回的时间中位数 编辑- 以下是在SQLFIDLE中构建表的信息在MySQL中,如何获取此查询返回的时间的中间值?,mysql,Mysql,我有以下疑问 从数据库返回以下时间 如何获取此查询返回的时间中位数 编辑- 以下是在SQLFIDLE中构建表的信息 CREATE TABLE `login_attempts` ( `id` int(11) UNSIGNED NOT NULL, `username` varchar(100) NOT NULL, `ip_address` varbinary(128) NOT NULL, `date_time` datetime DEFAULT NULL, `login_succ
CREATE TABLE `login_attempts` (
`id` int(11) UNSIGNED NOT NULL,
`username` varchar(100) NOT NULL,
`ip_address` varbinary(128) NOT NULL,
`date_time` datetime DEFAULT NULL,
`login_successful` tinyint(1) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `login_attempts` (`id`, `username`, `ip_address`, `date_time`, `login_successful`) VALUES
(1, 'test@test.com', '127.0.0.1', now(), 1),
(2, 'test', '127.0.0.1', now(), 0),
(3, 'test@test.com', '127.0.0.1', now(), 1),
(4, 'test', '127.0.0.1', now(), 0),
(5, ' test@test.com', '127.0.0.1', now(), 1);
ALTER TABLE `login_attempts`
ADD PRIMARY KEY (`id`);
ALTER TABLE `login_attempts`
MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
可以通过以下方式获得时间中值:
SELECT
TIME_FORMAT(SEC_TO_TIME(AVG(TIME_TO_SEC(timeTable.only_time))),'%H:%i:%s') AS medianTime
FROM
(
SELECT
TIME(date_time) only_time,
@rn := @rn + 1 AS row_number
FROM
login_attempts
CROSS JOIN (SELECT @rn := 0) var
WHERE
DATE_FORMAT(DATE(date_time), '%d-%m-%Y') = DATE_FORMAT('2016-08-09', '%d-%m-%Y') AND
login_successful = 1
ORDER BY only_time
) AS timeTable
CROSS JOIN
(
SELECT
COUNT(*) total_rows
FROM
login_attempts
WHERE
DATE_FORMAT(DATE(date_time), '%d-%m-%Y') = DATE_FORMAT('2016-08-09', '%d-%m-%Y') AND
login_successful = 1
) AS t
WHERE timeTable.row_number IN ( floor((total_rows+1)/2), floor((total_rows+2)/2))
请在SQLFIDLE中为数据创建DDL,这样人们就可以更好地帮助您,而不是花时间创建数据。对不起。我现在就去。
CREATE TABLE `login_attempts` (
`id` int(11) UNSIGNED NOT NULL,
`username` varchar(100) NOT NULL,
`ip_address` varbinary(128) NOT NULL,
`date_time` datetime DEFAULT NULL,
`login_successful` tinyint(1) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `login_attempts` (`id`, `username`, `ip_address`, `date_time`, `login_successful`) VALUES
(1, 'test@test.com', '127.0.0.1', now(), 1),
(2, 'test', '127.0.0.1', now(), 0),
(3, 'test@test.com', '127.0.0.1', now(), 1),
(4, 'test', '127.0.0.1', now(), 0),
(5, ' test@test.com', '127.0.0.1', now(), 1);
ALTER TABLE `login_attempts`
ADD PRIMARY KEY (`id`);
ALTER TABLE `login_attempts`
MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
SELECT
TIME_FORMAT(SEC_TO_TIME(AVG(TIME_TO_SEC(timeTable.only_time))),'%H:%i:%s') AS medianTime
FROM
(
SELECT
TIME(date_time) only_time,
@rn := @rn + 1 AS row_number
FROM
login_attempts
CROSS JOIN (SELECT @rn := 0) var
WHERE
DATE_FORMAT(DATE(date_time), '%d-%m-%Y') = DATE_FORMAT('2016-08-09', '%d-%m-%Y') AND
login_successful = 1
ORDER BY only_time
) AS timeTable
CROSS JOIN
(
SELECT
COUNT(*) total_rows
FROM
login_attempts
WHERE
DATE_FORMAT(DATE(date_time), '%d-%m-%Y') = DATE_FORMAT('2016-08-09', '%d-%m-%Y') AND
login_successful = 1
) AS t
WHERE timeTable.row_number IN ( floor((total_rows+1)/2), floor((total_rows+2)/2))