在业务系统中,判断当前时间是否处于预设的工作时间段是常见需求,比如考勤系统校验打卡时间有效性、业务系统限制非工作时段操作等,MySQL的TIME函数可以很方便地实现这类时间区间比对逻辑。

TIME函数的基本用法
TIME函数是MySQL中用于提取日期时间类型字段的时分秒部分的内置函数,返回值格式为HH:MM:SS,支持传入DATETIME、TIMESTAMP、TIME类型的参数,也可以直接传入符合时间格式的字符串。
下面是几个基础的使用示例:
-- 提取当前时间的时分秒部分
SELECT TIME(NOW());
-- 提取指定日期时间的时间部分
SELECT TIME('2024-05-20 14:30:25');
-- 直接传入时间字符串
SELECT TIME('09:15:00');
判断当前时间是否在工作时间段的实现思路
假设我们的工作时间段是每天的09:00:00到18:00:00,判断逻辑可以分为以下几步:
- 使用TIME函数获取当前时间的时间部分,得到当前时分秒值
- 将当前时间部分与工作时间段的起始时间、结束时间进行比对
- 如果当前时间大于等于起始时间且小于等于结束时间,就说明处于工作时段
需要注意时间比对的顺序,MySQL中时间类型的字符串可以直接进行大小比较,符合时间先后顺序的比较规则。
具体SQL实现示例
固定工作时间段的判断
如果工作时段是固定的09:00到18:00,直接比对即可:
-- 判断当前时间是否在工作时段内,返回1表示是,0表示否
SELECT
CASE
WHEN TIME(NOW()) >= '09:00:00' AND TIME(NOW()) <= '18:00:00'
THEN 1
ELSE 0
END AS is_work_time;
结合数据表的工作时段判断
如果工作时间段存储在数据表中,比如有work_time_config表,结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | int | 配置ID |
| start_time | time | 工作时段开始时间 |
| end_time | time | 工作时段结束时间 |
此时可以关联表进行判断:
-- 关联配置表判断当前时间是否在工作时段
SELECT
CASE
WHEN TIME(NOW()) >= wt.start_time AND TIME(NOW()) <= wt.end_time
THEN 1
ELSE 0
END AS is_work_time
FROM work_time_config wt
WHERE wt.id = 1;
跨天工作时段的判断
如果工作时段是跨天的,比如22:00到次日06:00,直接比对会失效,需要调整逻辑:
-- 判断跨天工作时段(22:00到次日06:00)是否处于工作时段
SELECT
CASE
-- 结束时间小于开始时间,说明跨天,当前时间大于等于开始时间 或者 小于等于结束时间都属于工作时段
WHEN '06:00:00' < '22:00:00' THEN
CASE
WHEN TIME(NOW()) >= '22:00:00' AND TIME(NOW()) <= '23:59:59' THEN 1
WHEN TIME(NOW()) >= '00:00:00' AND TIME(NOW()) <= '06:00:00' THEN 1
ELSE 0
END
ELSE
CASE
WHEN TIME(NOW()) >= '22:00:00' AND TIME(NOW()) <= '06:00:00' THEN 1
ELSE 0
END
END AS is_work_time;
注意事项
- TIME函数的参数如果是日期时间类型,会自动忽略日期部分,只保留时间部分,不需要额外处理日期
- 时间比对时,字符串格式需要和TIME函数的返回格式一致,建议使用HH:MM:SS的完整格式,避免比对错误
- 如果工作时段配置可能调整,建议将时段存储在数据表中,不要硬编码在SQL里,方便后续维护
通过上述方法,就可以在MySQL中灵活实现当前时间是否在工作时间段的判断,适配不同的业务场景需求。