Так что я немного в тупике, я знаю, как это делать теоретически, но у меня проблемы с этим на практике.
В принципе у меня есть таблица и таблица ревизий. Таблица отражает статус на данный момент, а таблица ревизий отражает прошлый статус таблицы.
id3, id2, id1, title, timestamp, status,
56456 229299 4775 x name 1432866912 0
56456 232054 123859 x name 1434000054 1
56456 235578 16623 x name 1435213281 1
56456 237496 139811 x name 1464765447 1
56456 381557 0 x name 1487642800 1
56456 616934 186319 x name 1496103368 1
56456 668046 246292 x name 1505386262 1
56456 766390 246292 x name 1523273582 1
В основном, я хочу посмотреть историческое live/offline
состояние всех записей в таблице. Поэтому я знаю, что текущий статус в live
, и я знаю даты, когда запись была в offline/live
.
То, что я хочу сделать, - рассчитать живые или автономные даты между отметками времени. Даты между 1 → 0 Даты концерта. Даты между 1 → Есть живые даты. Даты Между 0 → 1 - Даты в оффлайне и даты между 0 → 0 - Даты офлайн.
Поэтому в идеале мои данные будут иметь статус "живое/автономное", определяемое каждым днем между каждым из этих изменений состояния.
IE
На выходе будут отображаться даты между Timestamp 1432866912
и 1434000054
поскольку статус в Offline
Я пробовал искать, но ничего не видел.
РЕДАКТИРОВАТЬ:
@RaymondNijland Первая строка имеет unixtimestamp для даты May 28, 2015
а вторая строка - отметка даты June 11, 2015.
. Первая строка находится в offline
а вторая строка - live.
Поэтому я в основном хочу, чтобы мои данные выглядели так
Date Status
May 28, 2015 Offline
May 29, 2015 Offline
May 30, 2015 Offline
....
....
June 9, 2015 Offline
June 10, 2015 Offline
June 11, 2015 Live
June 12, 2015 Live
Мне нужно сделать это так, потому что наша база данных не хранит данные ежедневно, но только в случае внесения изменений в данные.
Вы не можете извлекать записи, которые не находятся в вашей таблице. В таких случаях вы должны сгенерировать последовательность дат, а затем выполнить перекрестные проверки или левые соединения и т.д.
взгляните на последовательность генерации даты
Ниже код генерирует список дат с использованием минимальных и максимальных дат из вашей таблицы ревизий. Сделайте перекрестную проверку с вашей ревизионной таблицей и получите last seen/found status code
для текущей даты строки.
если ваша таблица называется Revisions
со status
и timestamp
. следующий код SQL должен работать на вас:
select
TDates.genDate, -- generated date sequence
(select case when r.status =0 then 'Offline' else 'Live' end
from revisions R
WHERE date(from_unixtime(R.Timestamp)) <= TDates.genDate
order by R.timestamp desc
limit 1
) as genStatus
from
(
SELECT *
FROM
(select adddate(T4.minDate, t3*1000 + t2*100 + t1*10 + t0) genDate, T4.minDate, T4.maxDate from
(select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
(select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
(select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
(select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
-- using your table get the min date and max date we are going to check. So we generate just the required dates.
(select date(from_unixtime(min(R.timestamp))) as minDate, date(from_unixtime(max(R.timestamp))) as maxDate from revisions as R ) T4
) T
where T.genDate <= T.maxDate
) As TDates
order by TDates.genDate
это просто концепция, вы более чем можете улучшить рекомендации по производительности
Используйте "случай", чтобы узнать, является ли он автономным или живым, а функция "date_format" - отображать метку времени. Смотрите это демо: http://sqlfiddle.com/#!9/88281f/13
select DATE_FORMAT(FROM_UNIXTIME('timestamp'), '%b %e, %Y') AS 'date' ,
case when status=0 then 'Offline' else 'Live' end as 'status'
from yourTbl
order by 'timestamp'