社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

Henry • 5 年前 • 1301 次点击  

我有一个表,其中包含传感器数据和一列 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
 
1301 次点击  
文章 [ 3 ]  |  最新文章 5 年前
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;