所以我有点难过,我知道如何在理论上做到这一点,但我在实践中遇到了麻烦。
基本上我有一个表和一个修订表。该表反映了截至目前的状态,而修订表反映了该表的过去状态。
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是离线日期。
理想情况下,我的数据会在每个状态更改之间的每一天都显示实时/离线状态。
即
输出会显示时间戳1432866912
和时间戳之间的日期。 1434000054
状态为Offline
我尝试过搜索,但没有看到任何相关内容。
编辑:
@RaymondNijland第一行有一个日期May 28, 2015
&的unixtimestamp。第二行是日期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 :(得分:0)
使用" case"知道它是离线还是现场和" 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`
答案 1 :(得分: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
这只是概念,欢迎您提高性能提示