问题描述
- 一天当中不同时间段的累加
-
有样一张表。
其中字段status有六种状态SYSOPEN、SYSCOLOE、WAIT 、WORK 、STOP、 ALAM
其中SYSCLOSE对应的时间减去SYSOPEN对应的时间的值为开机时间.SYSOPEN和SYSCLOSE 在一天中出现的次数不定。同日期的不同时段的SYSCLOSE和SYSOPEN相减的值之和,为一天内的开机总时间。查询天数为任意日期范围(如2015.10.1---2015.10.31),求的查询日期范围内每天的开机总时间
求高手指点!!!
解决方案
http://download.csdn.net/download/kunkun1014/6856309
解决方案二:
楼上说的有道理,不过case不能覆盖完全,且不易规避,有一种情况会有问题,如求2015-10-02到2015-10-05期间的开机时间,2015-10-01开机,2015-10-02第一条数据是关机数据,同理2015-10-05最后是开机状态。这两种case没有涉及。
完全用sql实现我不太清楚。逻辑可以结合sql和代码实现:
1.使用sql:SELECT curTime, status FROM table WHERE status in ('SYSOPEN','SYSCOLOE') AND curTime BETWEEN '2015-10-01' AND '2015-10-05' ORDER BY curTime ASC; //其中 '2015-10-01'和'2015-10-05'是传入的期间参数
取出要求期间内的所有开机和关机时间升序排列。
2.代码中循环结果集,简单写:例如Entity为对应实体类
注:下面我把curTime当作已经转换为long,如何转换根据所用语言语法去做即可。
使用sql获取结果集result。
long sum = 0;
int index = 0;
if( 取result的第一条数据判断不是开机数据)
{
//case1,起始日期时已经是开机状态
sum = curTime减去0点的差;
index = 1;
}
long start = 0;
for(index <result.count)
{
Entity entity = result[index];
if(entity.status == SYSOPEN){
start = entity.curTime;
}else{
sum += entity.curTime - start;
start = 0;
}
}
if(start != 0){
// case2终止日期最后未关机。
sum += 24点 - start;
}
sum即为总开机时间,转换成需要的格式即可。
解决方案三:
为什么没人什么回答啊,着急!!!,是我说的不够清楚吗?
解决方案四:
这个你可以分开几步写,然后综合到一起:
先查询指定的日志范围;然后查同一个日期内的开机和关机时间;开机和关机是一对的,也就是说你开了机下一次就只能关机了,所以就没有必要判断下一次
是不是关机,如果现在是开机那下一次就肯定是关机;所以你判断当前状态如果为开机然后查一下关机在什么时候直接相减就可以了;然后用聚合函数sum一下,
解决方案五:
不管你使用那种语言,系统的时间约定一天的值等于1。
你可通过打开该表数据,指定日期范围并设置排序为时间的反序,(时间晚的前),这样通过累加,close-open值,就是该日期内的累计值。
解决方案六:
你可以将一天内所有关机时间总和求出来然后减去开机时间的总和;我没有测,你可以测测的
解决方案七:
这个是最简单的;因为要求答十个字以上,所以填上点废话
解决方案八:
SELECT SUM(tb.close_time-tb1.begin_time) AS open_time FROM (SELECT SUM(UNIX_TIMESTAMP(curtime
)) AS close_time,DATE(curtime
) AS day_date
FROM table
WHERE curtime
BETWEEN '2015-10-01' AND '2015-10-02' AND status
='SYSCLOSE' GROUP BY DATE(curtime
)) tb LEFT JOIN (SELECT SUM(UNIX_TIMESTAMP(curtime
)) AS begin_time,DATE(curtime
) AS day_date
FROM table
WHERE curtime
BETWEEN '2015-10-01' AND '2015-10-02' AND status
='SYSOPEN' group by DATE(curtime
)) tb1 ON tb.day_date = tb1.day_date;
这个是mysql 的写法,一天的关机时间和减去一天的开机时间和 等于一天总的开机时间
解决方案九:
sql语句查询是可以查询时间段。直接从昨天的0:0:0到23:59:59就是一天的时间段。
解决方案十:
首先,我觉得方法不对,如果一个开机时间是23点,关机时间却是第二天的1点,那么按照上面所述的方法,计算出一天的开机时间是错误的。
如果能保证,没有跨越零点的开关机,则上面的算法就没问题了。
我认为,应该对该表做一定的修改,增加列,或者增加关联表。记录每条记录的开机时间。这样如果获取某一天的开机时间的,只需要获取改列的sum就可以了。
如果有跨越0点的开关机操作,则应对当天首先出现system close的记录和当天最后出现为system open的记录做特殊处理。