计算日期范围之间的值

时间:2018-04-12 18:16:00

标签: mysql sql mysql-workbench

所以我有点难过,我知道如何在理论上做到这一点,但我在实践中遇到了麻烦。

基本上我有一个表和一个修订表。该表反映了截至目前的状态,而修订表反映了该表的过去状态。

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

我需要这样做,因为我们的数据库不会每天存储数据,但只有在对数据进行更改时才会这样做。

2 个答案:

答案 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)

您无法检索表格中没有的记录。在这种情况下,您必须生成日期序列,然后执行交叉检查或左连接等。

看看 Generating Date sequence

下面的代码使用修订表中的最小和最大日期生成日期列表。与您的修订表进行交叉检查,并获取当前行日期的last seen/found status code

假设您的表名为Revisions,并带有statustimestamp字段。 以下SQL代码应该适合您:

Fiddle here

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

这只是概念,欢迎您提高性能提示