如何在SQLite中将无前置0的12小时制字符串转换为时间?
在SQLite中转换12小时制时间为24小时制用于排序
SQLite没有像MySQL那样的STR_TO_DATE函数直接处理带AM/PM的12小时制时间,需要手动通过字符串拆分和条件判断实现转换,以下是两种可行的纯SQL方案:
方案一:兼容所有SQLite版本(无需SPLIT_PART)
通过INSTR定位分隔符,拆分时间的小时、分钟和AM/PM部分,再转换为24小时制:
SELECT -- 转换小时部分 CASE WHEN SUBSTR(your_time_col, -2) = 'PM' THEN CASE CAST(SUBSTR(your_time_col, 1, INSTR(your_time_col, ':') - 1) AS INTEGER) WHEN 12 THEN 12 ELSE CAST(SUBSTR(your_time_col, 1, INSTR(your_time_col, ':') - 1) AS INTEGER) + 12 END ELSE CASE CAST(SUBSTR(your_time_col, 1, INSTR(your_time_col, ':') - 1) AS INTEGER) WHEN 12 THEN 0 ELSE CAST(SUBSTR(your_time_col, 1, INSTR(your_time_col, ':') - 1) AS INTEGER) END END -- 拼接分钟和秒 || ':' || SUBSTR(your_time_col, INSTR(your_time_col, ':') + 1, 2) || ':00' AS StartTime FROM your_table ORDER BY StartTime;
方案二:SQLite 3.34+版本可用(更简洁)
利用SPLIT_PART函数直接拆分字符串,代码更易读:
SELECT CASE WHEN SPLIT_PART(your_time_col, ' ', 2) = 'PM' THEN CASE CAST(SPLIT_PART(your_time_col, ':', 1) AS INTEGER) WHEN 12 THEN 12 ELSE CAST(SPLIT_PART(your_time_col, ':', 1) AS INTEGER) + 12 END ELSE CASE CAST(SPLIT_PART(your_time_col, ':', 1) AS INTEGER) WHEN 12 THEN 0 ELSE CAST(SPLIT_PART(your_time_col, ':', 1) AS INTEGER) END END || ':' || SPLIT_PART(SPLIT_PART(your_time_col, ' ', 1), ':', 2) || ':00' AS StartTime FROM your_table ORDER BY StartTime;
核心逻辑说明
- AM时段:12:xx AM需转为00:xx,其余AM时间保留原小时数
- PM时段:12:xx PM保持12:xx,其余PM时间小时数加12
- 转换后的
StartTime是标准的HH:MM:SS格式字符串,SQLite会按字典序正确排序,完全满足ORDER BY的需求
内容的提问来源于stack exchange,提问作者Gary Shelton
相关产品推荐
相关产品推荐

