我有一个表,其中包含带有列timestamp
的传感器数据,该列保存进行传感器测量的时间的unix时间戳。
现在,我想SELECT
在特定日期/时间范围内以特定时间步长进行所有测量。
我自己弄清楚了第一部分,就像您可以在下面的我发布的代码片段中看到的那样。
// With $date_start and $date_stop in the format: '2010-10-01 12:00:00'
$result = mysqli_query($connection, "SELECT sensor_1
FROM sensor_table
WHERE timestamp >= UNIX_TIMESTAMP($date_start)
AND timestamp < UNIX_TIMESTAMP($date_stop)
ORDER BY timestamp");
现在在MySQL中是否有一种方便的方法可以将时间步长包括在同一SELECT
查询中?
我的表格在几个月中包含数千个测量值,每5秒进行一次测量。
现在让我们说我想在SELECT
和2010-10-01 12:00:00
之间进行2010-10-02 12:00:00
个测量,但是在此日期/时间范围内,每10分钟只有SELECT
个测量? (因为我的表格包含每5秒进行一次的测量)。
任何聪明的主意如何在单个查询中解决这个问题?
(其他想法也很受欢迎:))
答案 0 :(得分:2)
由于每5秒进行一次测量,因此sudo launchctl unload /Library/LaunchDaemons/my.jenkins.plist
sudo launchctl load -w /Library/LaunchDaemons/my.jenkins.plist
与第一个匹配测量之间的差不能大于4。然后,每600秒进行一次输入(允许时钟之间存在一些差异。) )
$date_start
答案 1 :(得分:0)
它不优雅,但您可以这样做:
SELECT s.sensor_1
FROM sensor_table s
WHERE s.timestamp >= UNIX_TIMESTAMP($date_start) AND
s.timestamp < UNIX_TIMESTAMP($date_stop) AND
s.timestamp = (SELECT MIN(s2.timestamp)
FROM sensor_table s2
WHERE s2.timestamp >= 60 * 10 * FLOOR(UNIX_TIMESTAMP(s.timestamp) / (60 * 10)) AND
s2.timestamp < s2.timestamp >= 60 * 10 * (1 + FLOOR(UNIX_TIMESTAMP(s.timestamp) / (60 * 10)))
)
ORDER BY timestamp;
这将选择每10分钟一次的第一个。
答案 2 :(得分:0)
我认为您可以在plSQL中使用一个简单的游标
CREATE TABLE StoreValuesId
(
valueId int primary key;
)
CREATE OR REPLACE procedure_store[date_start date,date_stop date]
DECLARE date_startUpdated date , date_stopUpdated date , date_diff TIME(7) = '00:10:00'
IS
BEGIN
SELECT date_start INTO date_startUpdated;
SELECT date_stop INTO date_stopUpdated;
IF timestamp BETWEEN date_start and date_stop then
INSERT INTO StoreValuesId values(timestamp)
date_startUpdated=DATEADD(SECOND, DATEDIFF(SECOND, 0, date_diff), date_startUpdated);
date_stopUpdated=DATEADD(SECOND, DATEDIFF(SECOND, 0, date_diff), date_stopUpdated);
END IF
COMMIT;
END
然后,语法可能是错误的,但我希望您能理解(一段时间内未使用sql了)