MySQL中如何基于开始时间与时长计算结束时间并排序停车会话
解决按停车会话结束时间排序的问题
嘿,我完全懂你的困扰——你想按结束时间升序返回某辆车的所有停车会话,但数据库里只存了开始时间和时长,之前的查询只能按开始时间排,对吧?其实很简单,咱们直接在查询里计算出结束时间,然后用这个计算结果来排序就搞定了!
核心逻辑
结束时间 = 开始时间 + 时长(小时),咱们把这个计算式放到ORDER BY里就行,不用额外存结束时间(当然如果频繁用这个逻辑的话,也可以考虑给表加个计算列,但临时查询直接计算更方便)。
不同数据库的具体写法
因为不同数据库处理时间加减的函数不一样,给你列几个常用的:
1. SQL Server
用DATEADD函数来添加小时数:
SELECT TimeDateStart, DurationHours, DATEADD(HOUR, DurationHours, TimeDateStart) AS TimeDateEnd FROM ParkingSessions WHERE VehicleId = '你的车辆标识' -- 替换成你要查询的目标车辆ID ORDER BY DATEADD(HOUR, DurationHours, TimeDateStart) ASC;
2. MySQL
可以直接用+ INTERVAL语法,或者DATE_ADD函数:
SELECT TimeDateStart, DurationHours, TimeDateStart + INTERVAL DurationHours HOUR AS TimeDateEnd FROM ParkingSessions WHERE VehicleId = '你的车辆标识' ORDER BY TimeDateStart + INTERVAL DurationHours HOUR ASC;
3. PostgreSQL
用字符串拼接转成INTERVAL类型来计算:
SELECT TimeDateStart, DurationHours, TimeDateStart + (DurationHours || ' hours')::INTERVAL AS TimeDateEnd FROM ParkingSessions WHERE VehicleId = '你的车辆标识' ORDER BY TimeDateStart + (DurationHours || ' hours')::INTERVAL ASC;
为什么之前的排序不对?
你之前只按TimeDateStart排序的话,会出现这种矛盾情况:比如同一辆车上午8点停了10小时(结束到18点),上午10点又停了2小时(结束到12点)——按开始时间排的话,8点的会话会排在10点的前面,但实际上它的结束时间更晚,完全不符合你要的“按结束时间升序”的需求。用计算出的结束时间排序就能完美规避这个问题啦!
内容的提问来源于stack exchange,提问作者Cory Ponter
相关产品推荐
相关产品推荐

