这几天我一直在为这个问题苦苦思索。我有一台可能有错误的机器。在数据库中,我有错误出现时的开始和结束时间(以 unix 时间为单位),以及错误类型(数字 5-12)。我遇到的问题是多个错误可能同时发生(并且重叠)。
我的表格是这样的:
id| type | from | to
1| 6 | 1417179933 | 1417180006
2| 6 | 1417180035 | 1417180065
3| 9 | 1417180304 | 1417180409
4| 6 | 1417180662 | 1417184364
5| 8 | 1417180662 | 1417186832
6| 9 | 1417180662 | 1417184364
7| 12 | 1417180662 | 1417184364
8| 6 | 1417184364 | 1417186832
9| 9 | 1417184364 | 1417188054
我需要找出这台机器的错误总持续时间。我无法总结上表中的所有差异,因为有可能在同一时间间隔内出现两个或更多错误。记录按升序排序。
我的猜测是将每条记录(开始和结束时间)与之前的记录进行比较,然后以秒为单位找出差异。然而,这张表会随着时间的推移而增长,搜索它是一个问题。
在 PHP 或 MySQL 中是否有一种聪明的方法可以找到机器不工作的总时间,可能以分钟为单位?
最佳答案
这是考虑潜在重叠的区间求和的一般方法,假设区间按其较低的值排序。
添加两个区间时 [a,b]和 [c,d] ,因此 (d-c) + (b-a)你计算它们的重叠两次。
如果重叠不为零,那么它的值为min(b,d) - max(a,c) .由于您在间隔开始时对项目进行了排序,因此您知道 max(a,c) == c .
如果重叠为0,a <= b <= c <= d所以min(b,d) == b , max(a,c) == c , 和 min(b,d) - max(a,c) == b - c <= 0 .你总是想删除 0然而。
因此,一般公式为 d-c + b-a - max(0,min(b,d)-c)
要推广到多于两个的间隔,只需考虑添加新间隔时的情况 [c,d]对于任意数量的先前间隔,您添加 (d-c)并且计算两次的重叠在[c,d]之间以及所有先前间隔的并集。
由于您根据起始值对间隔进行排序,因此您只需要考虑该联合的最后一个连续间隔,因此对您来说是最后一个连续的停机时间。
如果[a,b]是您之前的最后一个连续间隔,您刚刚添加了 [c,d] :
[a,b]和 [c,d] overlap,你最后的连续间隔变成[a, max(b,d)]因为这是 [a,b] 的并集和 [c,d] [a,b]和 [c,d]不要重叠,你最后的连续间隔变成[c, d] (注意:我们有 max(b,d) == b )自 a < c由于排序间隔,间隔重叠 iff c < b
这在 php 中可能比在 mysql 中更容易实现。在伪代码中,假设每一行返回一个(开始,结束)错误间隔,并且[a,b]是您最后已知的连续间隔:
(a,b) = get_first_row();
downtime = b-a;
while( (c,d) = get_next_row() )
{
downtime += d-c - max(0, min(d,b)-c);
a = c < b ? a : c;
b = max(b,d);
}
您可以在此处看到此代码成功运行:https://3v4l.org/Q2phs
关于php - 查找重叠值的时间总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27232349/
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实
在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:
我想找到给定字符串中的所有匹配项,包括重叠匹配项。我怎样才能实现它?#Example"a-b-c-d".???(/\w-\w/)#=>["a-b","b-c","c-d"]expected#Solutionwithoutoverlappedresults"a-b-c-d".scan(/\w-\w/)#=>["a-b","c-d"],but"b-c"ismissing 最佳答案 在积极的前瞻中使用捕获:"a-b-c-d".scan(/(?=(\w-\w))/).flatten#=>["a-b","b-c","c-d"]参见Rubyde
我想查找字符串的结尾是否与单独字符串的开头重叠。例如,如果我有这两个字符串:string_1='Peoplesaynothingisimpossible,butI'string_2='butIdonothingeveryday.'如何找到string_1末尾的“butI”部分与string_2开头相同?我可以编写一个方法来遍历这两个字符串,但我希望得到一个包含我错过的Ruby字符串方法或Ruby习惯用法的答案。 最佳答案 将MARKER设置为一些从未出现在您的string_1和string_2中的字符串。有一些方法可以动态地做到这一