如何在MySQL中选择具有特定时间戳步长的特定日期/时间范围内的所有行?

时间:2019-03-17 18:05:14

标签: mysql sql select mysqli timestamp

我有一个表,其中包含带有列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秒进行一次测量。

现在让我们说我想在SELECT2010-10-01 12:00:00之间进行2010-10-02 12:00:00个测量,但是在此日期/时间范围内,每10分钟只有SELECT个测量? (因为我的表格包含每5秒进行一次的测量)。

任何聪明的主意如何在单个查询中解决这个问题?
(其他想法也很受欢迎:))

3 个答案:

答案 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了)