如何计算数据库中starting与ending字段的时间间隔?已试whereBetween无效
嘿,我懂你为啥用whereBetween没效果了——这个方法本来就不是用来计算两个字段时间差的,它是用来筛选单个字段的值落在某个区间内的(比如找starting在09:00到12:00之间的记录),完全不是一回事儿~
咱们来搞定两个时间字段的间隔计算,分两种场景说:
1. 直接写原生SQL的情况
不同数据库的时间差函数不一样,给你列两个常用的:
- MySQL/MariaDB:用
TIMESTAMPDIFF()可以直接算出指定单位的差值,比如要算分钟差:
SELECT *, TIMESTAMPDIFF(MINUTE, starting, ending) AS interval_minutes FROM your_table;
把MINUTE换成HOUR就是小时差,换成SECOND就是秒差;要是想要02:15这种时间格式的差值,用TIMEDIFF(ending, starting)就行。
- PostgreSQL:可以把时间转成秒数再计算,比如分钟差:
SELECT *, EXTRACT(EPOCH FROM (ending::TIME - starting::TIME)) / 60 AS interval_minutes FROM your_table;
2. 用Laravel Eloquent的情况(毕竟你提到了whereBetween,大概率是Laravel)
直接用selectRaw()把SQL函数嵌进去就能拿到差值:
$results = YourModel::selectRaw('*, TIMESTAMPDIFF(MINUTE, starting, ending) AS interval_minutes') ->get();
这样每条结果里都会多一个interval_minutes字段,就是两个时间的分钟差。
如果是要筛选时间间隔符合条件的记录(比如找间隔超过30分钟的),就用whereRaw():
$longIntervals = YourModel::whereRaw('TIMESTAMPDIFF(MINUTE, starting, ending) > 30') ->get();
最后提个小提醒:如果你的starting和ending是字符串类型(不是数据库的TIME类型),最好先转成时间格式再计算,比如MySQL里用STR_TO_DATE(starting, '%H:%i')转成时间类型,避免出现计算错误~
内容的提问来源于stack exchange,提问作者Rami
相关产品推荐
相关产品推荐

