MySQL 查询固定时间段的数据

本文介绍了如何使用MySQL查询一周内每天9:00至11:30和13:00至15:00的历史数据。通过FROM_UNIXTIME、UNIX_TIMESTAMP、DATE_FORMAT等时间转换函数,将Unix时间戳转换为日期格式并进行时间判断,解决在Zabbix历史数据表history_uint中的查询问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天想用MySQL查点东西,需求如下:

查一周时间内的每天上午9点到11点半和下午1点到3点的所有数据。

数据库表结构比较简单,就是Zabbix的默认数据库表结构,查一下历史数据表。

history_uint 表结构如下:

字段名类型备注

itemid

bigint监控项id
clockintepoch时间戳(unix时间戳),精确到秒
valuebigint监控项的值
nsint纳秒

 

 

 

 

 

 

直接贴SQL吧,贴完再说思路:

SELECT
	a.itemid, FROM_UNIXTIME(a.clock) a_time, a.value
FROM
	history_uint a
WHERE
	itemid=29176
AND
	-- 时间段限制,一周或者任意时间段
	-- DATE_SUB(now(),INTERVAL 7 DAY) <= FROM_UNIXTIME(a.clock)
	a.clock BETWEEN UNIX_TIMESTAMP('2019-03-24 09:00:00') AND UNIX_TIMESTAMP('2019-03-26 15:00:00')
AND
	-- 每天时间段限制,格式化日期到时分秒
(
	DATE_FORMAT(FROM_UNIXTIME(a.clock), '%H:%i:%S') BETWEEN '09:00:00' AND '11:30:00'
	OR
	DATE_FORMAT(FROM_UNIXTIME(a.clock), '%H:%i:%S') BETWEEN '13:00:00' AND '15:00:00'
)

实际上就是这个时间段格式不太会写,导致这个where子句一直写不出来。先将unix时间戳转成日期格式,再将日期格式格式化成时分秒,忽略日期,这样就可以进行时分秒上的时间判断了,注意由于是两个时间段,因此是或的关系,并且最后的时间段判断要括号括起来。

主要涉及MySQL时间转换这几个函数:

1.unix时间戳转日期格式 FROM_UNIXTIME(a.clock,"format")

例子1:SELECT FROM_UNIXTIME(1553070856)

默认不跟格式,如下结果:

例子2:SELECT FROM_UNIXTIME(1553070856, "%Y-%m-%d %h:%i:%S")

2.日期格式转unix时间戳 UNIX_TIMESTAMP('time')

例子:UNIX_TIMESTAMP('2019-03-24 09:00:00')

3.时间日期格式化 DATE_FORMAT(time,'format')

例子:SELECT DATE_FORMAT(FROM_UNIXTIME(1553070856), '%H:%i:%S')

4.日期格式化参数

"format"参数:

常用例子:"%Y-%m-%d %H:%i:%S"   2019-03-20 16:34:16

%Y年,四位格式:2019

%y

年,两位格式:19
%M月,英文格式:March
%m月,两位格式:03
%D日,带英文后缀:20th
%d日,两位格式:20
%H时,24小时格式:16
%h时,12小时格式:04
%i分,两位格式:34
%S秒,两位格式:16,如果是8秒,则显示08
%s秒,普通格式:如果是8秒,则显示8

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值