加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

MySQL选择时间戳最接近但不超过给定时间戳的行

发布时间:2021-04-01 00:11:50 所属栏目:编程 来源:网络整理
导读:我有一张桌子,看起来如下 state_history+---------------------+-----------+----------------+ +| state_added_time | entity_id | state_id | .... |+---------------------+-----------+----------------+ || 2015-05-15 13:24:22 | 1 | 1 | || 2015-05-1

我有一张桌子,看起来如下

state_history
+---------------------+-----------+----------------+      +
| state_added_time    | entity_id | state_id       | .... |
+---------------------+-----------+----------------+      |
| 2015-05-15 13:24:22 |         1 |              1 |      |
| 2015-05-15 13:29:44 |         3 |              2 |      |
| 2015-05-15 13:34:26 |         2 |              2 |      |
| 2015-05-15 14:24:28 |         1 |              3 |      |
| 2015-05-15 14:24:30 |         2 |              3 |      |
| 2015-05-15 14:26:32 |         3 |              5 |      |
| 2015-05-15 14:26:34 |         3 |              3 |      |
.......

我的目标是在任何特按时刻相识全部实体的状态.譬喻,假如从应用措施收到的时刻戳是2015-05-15 14:25:00,那么预期的输出应该是:

state_history
+---------------------+-----------+----------------+      +
| state_added_time    | entity_id | state_id       | .... |
+---------------------+-----------+----------------+      |
| 2015-05-15 14:24:28 |         1 |              3 |      |
| 2015-05-15 14:24:30 |         2 |              3 |      |
| 2015-05-15 13:29:44 |         3 |              2 |      |
.......

也就是说,要知道在给按时刻之前或之后每个实体产生的最后状态变革.状态变革之间的隔断不牢靠.因此,我不能有2个时刻界线,并在它们之间找到行.

我实行过行使TIMEDIFF但未能得到所需的输出.任何人都可以指导我走的路吗?

编辑:感激各人的快速回覆.我实行了谜底,并留意到在现实数据库上执行时,查询必要耗费大量时刻来获取行.也许是由于字段entity_id和state_id是其他两个表的外键.
此刻知道这是否有任何要领可以进步查询的机能? 最佳谜底 您也可以行使变量来完成:

SELECT entity_id,state_added_time,state_id
FROM (
  SELECT state_added_time,state_id,@row_number:= CASE WHEN @entity = entity_id THEN @row_number+1
                             ELSE 1
                        END AS row_number,@entity:=entity_id AS entity_id   
  FROM state_history
  WHERE state_added_time <= '2015-05-15 14:25:00'
ORDER BY entity_id,state_added_time DESC ) t
WHERE t.row_number = 1

每次碰着新的entity_id时城市重置@row_number.在每个entity_id中,@ row_number = 1的值指向最近的记录.

SQL Fiddle Demo

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读