У меня есть таблица, которая сохраняет дату и час от доступов к веб сайту.
таблица сохраняет дату в формате 000-00-00 0:00:00 и я форматирую ее с
DATE_FORMAT(ultimo_login,'%Y/%m/%d')
совсем правильный до сих пор
SELECT
COUNT(DATE_FORMAT(ultimo_login,'%Y/%m/%d')) AS contador
, DATE_FORMAT(ultimo_login,'%Y/%m/%d') AS concepto
FROM userslogins
GROUP BY concepto;
Случай состоит в том, что мне не хватает дат между одними и другими, и сколько бы я это не пробую мне не удается наполнить их.
консультация оказывается такой
и он должен бы быть
Кто-то мог бы помогать мне с этим? Тысячи спасибо
ЗАМЕТЬ: даты, которых нет,, - из-за которого совсем не работал этот день, не из-за которого он бьет козырем вводить их в компьютер...
То, что deberГ-схвати делания, состоит в том, чтобы производить временную таблицу с рангом дат, что ты нуждаешься в
, это хранившийся процесс, который ты можешь выполнять, чтобы создавать временную таблицу с реестрами, с этим ты мог бы делать subquery в таблицу userslogins
# generar la tabla temporal entre el rango deseado
call make_intervals(
(SELECT MIN(ultimo_login) FROM userslogins),
(SELECT MAX(ultimo_login) FROM userslogins),
1,
'DAY'
);
# consulta deseada
select
(SELECT COUNT(*) FROM userslogins WHERE DATE(ultimo_login) = DATE(interval_start)) AS contador,
DATE_FORMAT(interval_start,'%Y/%m/%d') AS concepto
from time_intervals;
DELIMITER $
USE `database`$
DROP PROCEDURE IF EXISTS `make_intervals`$
CREATE DEFINER=`root`@`localhost` PROCEDURE `make_intervals`(startdate timestamp, enddate timestamp, intval integer, unitval varchar(10))
deterministic
BEGIN
declare thisDate timestamp;
declare nextDate timestamp;
set thisDate = startdate;
-- *************************************************************************
-- Drop / create the temp table
-- *************************************************************************
drop temporary table if exists time_intervals;
create temporary table if not exists time_intervals
(
interval_start timestamp,
interval_end timestamp
);
-- *************************************************************************
-- Loop through the startdate adding each intval interval until enddate
-- *************************************************************************
repeat
select
case unitval
when 'MICROSECOND' then timestampadd(MICROSECOND, intval, thisDate)
when 'SECOND' then timestampadd(SECOND, intval, thisDate)
when 'MINUTE' then timestampadd(MINUTE, intval, thisDate)
when 'HOUR' then timestampadd(HOUR, intval, thisDate)
when 'DAY' then timestampadd(DAY, intval, thisDate)
when 'WEEK' then timestampadd(WEEK, intval, thisDate)
when 'MONTH' then timestampadd(MONTH, intval, thisDate)
when 'QUARTER' then timestampadd(QUARTER, intval, thisDate)
when 'YEAR' then timestampadd(YEAR, intval, thisDate)
end into nextDate;
insert into time_intervals select thisDate, timestampadd(MICROSECOND, -1, nextDate);
set thisDate = nextDate;
until thisDate >= enddate
end repeat;
END$
DELIMITER ;