Py学习  »  DATABASE

在MySQL中,如何选择某个日期/时间范围内某个时间戳步长的所有行?

Henry • 6 年前 • 1371 次点击  

我有一个表,其中包含传感器数据和一列 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中加入一个时间步长 选择 查询?

我的表包含了几个月的数千次测量,每5秒测量一次。

现在假设我想 选择 测量值介于 2010-10-01 12:00:00 2010-10-02 12:00:00 但只在这个日期/时间范围内 选择 每10分钟测量一次?(因为我的表包含每5秒测量一次)。

有什么聪明的想法如何在一个查询中解决这个问题吗?
(也欢迎其他想法:)

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39134
 
1371 次点击  
文章 [ 3 ]  |  最新文章 6 年前
Ignorant Fanatic
Reply   •   1 楼
Ignorant Fanatic    6 年前

我认为您可以在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)

Gordon Linoff
Reply   •   2 楼
Gordon Linoff    6 年前

它不优雅,但您可以做到:

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分钟中的第一个。

Dario
Reply   •   3 楼
Dario    6 年前

因为你每5秒测量一次 $date_start 第一个匹配测量值不能大于4。然后我们每600秒进行一次输入(考虑到时钟之间的某些差异…)

SELECT sensor_1 
  FROM sensor_table
 WHERE timestamp >= UNIX_TIMESTAMP($date_start) 
       AND 
       timestamp < UNIX_TIMESTAMP($date_stop) 
       AND
       ((timestamp - UNIX_TIMESTAMP($date_start)) % 600) BETWEEN 0 AND 4 
 ORDER BY timestamp;