MySQL查询:筛选CurrTime晚于或等于StartTime的记录
解决方案
要筛选出CurrTime时间部分大于等于StartTime的记录,核心是把CurrTime的时间部分和提取出的StartTime做比较——因为CurrTime是包含日期的完整datetime类型,而StartTime只有时分信息,直接用TIME()函数提取CurrTime的时分秒部分即可完成有效比较。
方法1:使用子查询(推荐,可读性更高)
先通过子查询生成包含StartTime的中间结果,再在外部查询中添加筛选条件:
SELECT * FROM ( SELECT *, CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(EvName, ':', 1), ' ', -1), ":", SUBSTRING_INDEX(SUBSTRING_INDEX(EvName, ':', -1), ' ', 1)) AS StartTime FROM uk ) AS temp WHERE TIME(CurrTime) >= StartTime;
方法2:直接在WHERE子句中重复计算
如果不想用子查询,也可以直接在筛选条件里重复StartTime的提取逻辑,不过这种方式可读性较差,大表查询时可能因重复计算影响性能:
SELECT *, CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(EvName, ':', 1), ' ', -1), ":", SUBSTRING_INDEX(SUBSTRING_INDEX(EvName, ':', -1), ' ', 1)) AS StartTime FROM uk WHERE TIME(CurrTime) >= CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(EvName, ':', 1), ' ', -1), ":", SUBSTRING_INDEX(SUBSTRING_INDEX(EvName, ':', -1), ' ', 1));
关键说明
TIME(CurrTime)会从CurrTime中提取出时分秒部分(比如2022-06-01 17:45:39会被提取为17:45:39)- MySQL会自动将字符串类型的
StartTime(比如17:45)转换为时间类型(补全为17:45:00)进行比较,因此17:45:39 >= 17:45:00会返回true,完全匹配你的筛选需求。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

