You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:20:30