Расчет значения между диапазонами дат

0

Так что я немного в тупике, я знаю, как это делать теоретически, но у меня проблемы с этим на практике.

В принципе у меня есть таблица и таблица ревизий. Таблица отражает статус на данный момент, а таблица ревизий отражает прошлый статус таблицы.

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

Мне нужно сделать это так, потому что наша база данных не хранит данные ежедневно, но только в случае внесения изменений в данные.

  • 0
    думаю, что вам нужно смоделировать LEAD в MySQL, каков ожидаемый вывод на основе ваших данных примера?
  • 0
    Я полностью сбит с толку. Что представляют собой строки? Откуда приходит 14328669127? Какой выход вы хотите? Где хранится «день»?
Показать ещё 9 комментариев
Теги:
mysql-workbench

2 ответа

0

Вы не можете извлекать записи, которые не находятся в вашей таблице. В таких случаях вы должны сгенерировать последовательность дат, а затем выполнить перекрестные проверки или левые соединения и т.д.

взгляните на последовательность генерации даты

Ниже код генерирует список дат с использованием минимальных и максимальных дат из вашей таблицы ревизий. Сделайте перекрестную проверку с вашей ревизионной таблицей и получите 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

это просто концепция, вы более чем можете улучшить рекомендации по производительности

  • 0
    Спасибо, я сообщу вам, когда у меня будет возможность просмотреть это.
0

Используйте "случай", чтобы узнать, является ли он автономным или живым, а функция "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'
  • 0
    Спасибо, я знаю, как это сделать, но у меня возникли проблемы с отображением статуса Live / Offline между двумя разными датами. Я уточнил в своем оригинальном посте.
  • 0
    Понял. Я пересматриваю свой ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню