我有一个 SQL 表,其中记录了电表(计数器)的绝对值。每增加 5 个值或最迟每 15 分钟自动添加新行。
表格数据可能看起来像这样:
id value time
1 2500 21.12.16 01:09:52
2 2505 21.12.16 01:10:23
3 2510 21.12.16 01:11:00
4 2512 21.12.16 01:26:00
...
1500 4502 22.12.16 00:00:03
1501 4507 22.12.16 00:00:58
...
3456 6528 23.12.16 00:00:10
3457 6533 23.12.16 00:05:22
给定开始时间、结束时间和采样时间,是否可以得到值之间的差异?
例如,
start_time = 21.12.16 02:00:00
stop_time = 21.12.16 03:15:00
sampling_time = 15 minutes
应执行以下操作:
Get value at start_time (or closest to it) = value1
Get value at start_time + sampling_time (or closest to it) = value2
Select difference between value1 and value 2
Get value at start_time + 2*sampling_time (or closest to it) = value3
Select difference between value 2 and value 3
... so on, until start_time + n*sampling_time > stop_time
预期结果可能是这样的:
20 //Difference between value 1 at 2:00 (or closest) and value 2 at 2:15 (or closest)
18 //Diff. between value 2 (2:15) and value 3 (2:30)...
23
15
45 //... Diff. between value n-1 (3:00) and value n (3:15)
用纯 SQL 可以吗?或者我应该以不同的方式记录消耗的能量吗?
最佳答案
我首先创建表格并插入前几行,以便您了解我正在使用的表格架构。请注意,id 被视为 PRIMARY KEY 值。
CREATE table t1(
`id` int PRIMARY KEY,
`value` int,
`time` timestamp
)Engine=InnoDB;
INSERT INTO t1 VALUES
(1,2500,'21.12.16 01:09:52'),
(2,2505,'21.12.16 01:10:23'),
(3,2510,'21.12.16 01:11:00'),
(4,2512,'21.12.16 01:26:00');
您要求的查询是两个不同查询之间的减法:
查询 1:从时间 = **smaller_timestamp** 的 t1 中选择值
查询 2:从时间 = **larger_timestamp** 的 t1 中选择值
获取结果:SELECT query1 - query2;
示例:
-- smaller timestamp
mysql> select value from t1 where time ='21.12.16 01:09:52';
+-------+
| value |
+-------+
| 2500 |
+-------+
1 row in set (0.00 sec)
-- larger timestamp
mysql> select value from t1 where time ='21.12.16 01:26:00';
+-------+
| value |
+-------+
| 2512 |
+-------+
1 row in set (0.00 sec)
mysql> SELECT (select value from t1 where time ='21.12.16 01:26:00')-(select value from t1 where time ='21.12.16 01:09:52') AS value_difference;
+------------------+
| value_difference |
+------------------+
| 12 |
+------------------+
1 row in set (0.00 sec)
更一般地说,您可以使用 DATE_ADD(date, INTERVAL) 等方法利用不同的开始/结束时间。
示例:对于这种情况,我使用了 time='21.12.16 01:11:00' 和 INTERVAL=15 分钟。
mysql> SELECT
-> (select value from t1 where time =DATE_ADD('21.12.16 01:11:00', INTERVAL 15 minute))-
-> (select value from t1 where time='21.12.16 01:11:00')
-> AS
-> value_difference;
+------------------+
| value_difference |
+------------------+
| 2 |
+------------------+
1 row in set (0.00 sec)
我应该让你知道,如果你想做“最接近”,那么你应该使用大于/小于比较、ORDER BY 和函数 LIMIT 而不仅仅是选择。
示例:
mysql> SELECT
-> (select value from t1 where time<=DATE_ADD('21.12.16 01:11:00', INTERVAL 15 minute) ORDER BY value DESC LIMIT 1)-
-> (select value from t1 where time<='21.12.16 01:09:52' ORDER by value ASC LIMIT 1)
-> AS
-> value_difference;
+------------------+
| value_difference |
+------------------+
| 12 |
+------------------+
1 row in set (0.00 sec)
应@bishop 的要求,以下是这些查询作为存储过程的示例。
第一种情况是有 2 个时间戳可供比较:
DELIMITER //
CREATE PROCEDURE calculateValue(startTime TIMESTAMP, endTime TIMESTAMP)
BEGIN
set @startTime = startTime;
set @endTime = endTime;
set @resultStart=concat("SELECT value FROM t1 WHERE time <='",@startTime,"' ORDER BY value DESC LIMIT 1");
set @resultEnd=concat("SELECT value FROM t1 WHERE time <= '",@endTIME,"' ORDER BY value DESC LIMIT 1");
set @query=concat("SELECT (",@resultEnd,")-(",@resultStart,") AS 'value_difference'");
prepare stmt from @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
第二种情况是使用DATE_ADD 函数。
DELIMITER //
CREATE PROCEDURE calculateValue(startTime TIMESTAMP, timeInterval VARCHAR)
BEGIN
set @startTime = startTime;
set @timeInterval= timeInterval;
set @resultStart=concat("SELECT value FROM t1 WHERE time <=DATE_ADD('",@startTime,"',INTERVAL ",@timeInterval,") ORDER BY value DESC LIMIT 1");
set @resultEnd=concat("SELECT value FROM t1 WHERE time <= '",@endTIME,"' ORDER BY value DESC LIMIT 1");
set @query=concat("SELECT (",@resultEnd,")-(",@resultStart,") AS 'value_difference'");
prepare stmt from @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
关于MySQL 选择给定采样时间的能量计数器变化率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41253513/
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
这个问题在这里已经有了答案: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
尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot
状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基
在启用Rack::Deflater来gzip我的响应主体时偶然发现了一些奇怪的东西。也许我遗漏了一些东西,但启用此功能后,响应被压缩,但是资源的ETag在每个请求上都会发生变化。这会强制应用程序每次都响应,而不是发送304。这在没有启用Rack::Deflater的情况下有效,我已经验证页面源没有改变。我正在运行一个使用thin作为Web服务器的Rails应用程序。Gemfile.lockhttps://gist.github.com/2510816有没有什么方法可以让我从Rack中间件获得更多的输出,这样我就可以看到发生了什么?提前致谢。 最佳答案
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实