在MySQL中,如何获取此查询返回的时间的中间值?

在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

我有以下疑问

从数据库返回以下时间

如何获取此查询返回的时间中位数

编辑- 以下是在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_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))