Air*_*ire 5 mysql-5.5 datetime
对于学校项目,我们试图根据 5 个传感器(3x O3、1x 温度、1x 湿度)的组合来计算(校正)臭氧值。
我们在项目的其余部分使用 MySQL 和 PHP。
该表Measurements
具有以下结构:
id (int(11))
time (datetime)
value (float)
measured_value (float)
sensor (tinytext)
unit (tinytext)
measurement_short_type (tinytext)
stream_id int(11)
Run Code Online (Sandbox Code Playgroud)
所以一个示例行看起来像这样:
ID Time value measured_value sensor unit measurement_short_type stream_id
---- ------------------- ----- -------------- ------ ----- ---------------------- ---------
3324 2016-05-21 11:00:34 0 193 O3r KOhms O3 6511
Run Code Online (Sandbox Code Playgroud)
如您所见,我们有 2 列,value
(float) 和measured_value
(float)。
为了value
根据单个传感器数据(存储在 中measured_value
)计算正确的最终数据,我们需要对每个数据点应用与此类似的公式:
Corrected value[datetime] = ("6511".measured_value[datetime] * -0.106830613)
+ ("6512".measured_value[datetime] * 0.065201457)
+ ("6513".measured_value[datetime] * 0.335456161)
+ ("6514".measured_value[datetime] * -0.248569888)
+ ("6515".measured_value[datetime] * 1.423460009) + -2.113591555
Run Code Online (Sandbox Code Playgroud)
其中 6511、6512、...、6515 是 5 个传感器(3x O3、1x 温度、1x 湿度)的 ID。所有传感器的值都存储在同一个表中。
表示法的"6514". measured_value[datetime]
意思是:使用measured_value
(不是value
!)具有大致相同日期时间戳的行和流 ID 6514
。
所有传感器大约同时报告它们的值,每 30 分钟(即 x:00 和 x:30),但不完全是:一个传感器可能有10:59:59
时间戳,另一个传感器11:00:34
。
据我所知,解决这个问题有两个要素:
如果这是不可能的,有人可以就如何实现这一目标提出建议吗?我们无法影响传感器的时序,但如果便于计算,我们可以更改 DB/表结构。
您可以执行以下操作,前提是您的传感器 6511 每 30 分钟可靠地进行一次测量(使用最可靠的传感器)。这将根据所使用的主传感器的记录(主要是 FROM,在本例中为 6511)计算测量值,显示此类记录的确切日期和时间,还显示 30 分钟时段内的调整时间,并使用任何可用的测量值对于所有其他传感器,以主要测量后 10 分钟内可用的最新传感器为准:
SELECT "date",
DATE("date") + INTERVAL round((UNIX_TIMESTAMP("date") - UNIX_TIMESTAMP(DATE("date")))/1800) * 30 MINUTE AS adj_date,
(measured_value * -0.106830613) +
(SELECT measured_value * 0.065201457
FROM Measurements
WHERE stream_id = '6512' AND "date" < (s1."date" + INTERVAL 10 MINUTE)
ORDER BY "date" DESC LIMIT 1) +
(SELECT measured_value * 0.335456161
FROM Measurements
WHERE stream_id = '6513' AND "date" < (s1."date" + INTERVAL 10 MINUTE)
ORDER BY "date" DESC LIMIT 1) +
(SELECT measured_value * -0.248569888
FROM Measurements
WHERE stream_id = '6514' AND "date" < (s1."date" + INTERVAL 10 MINUTE)
ORDER BY "date" DESC LIMIT 1) +
(SELECT measured_value * 1.423460009
FROM Measurements
WHERE stream_id = '6515' AND "date" < (s1."date" + INTERVAL 10 MINUTE)
ORDER BY "date" DESC LIMIT 1) + -2.113591555 AS "Corrected value"
FROM "Measurements" AS s1
WHERE stream_id = '6511';
Run Code Online (Sandbox Code Playgroud)
确保您有一个索引stream_id, "date"
!
归档时间: |
|
查看次数: |
35 次 |
最近记录: |