業務表因歷史原因將日期時間存為 VARCHAR(如 '20170120 10:59:31'),直接 ORDER BY 會按字典序排序,導致 '20170120...' < '20171201...' 但 '20170120...' > '20170119...' 等邏輯錯誤。
-- 單表查詢並按真實時間倒序
SELECT
STR_TO_DATE(class_time, '%Y%m%d %H:%i:%s') AS real_time,
*
FROM a
ORDER BY real_time DESC;
| 符號 | 含義 | 示例 |
|---|---|---|
| %Y | 四位年份 | 2017 |
| %m | 兩位月份 | 01~12 |
| %d | 兩位日期 | 01~31 |
| %H | 24制小時 | 00~23 |
| %i | 分鐘 | 00~59 |
| %s | 秒 | 00~59 |
-- 查詢某時間範圍
SELECT * FROM a
WHERE STR_TO_DATE(class_time, '%Y%m%d %H:%i:%s')
BETWEEN '2017-01-01 00:00:00' AND '2017-01-31 23:59:59';
ALTER TABLE a ADD real_time DATETIME GENERATED ALWAYS AS (STR_TO_DATE(class_time, '%Y%m%d %H:%i:%s')) VIRTUAL; 並建立索引。UPDATE a SET class_time = DATE_FORMAT(STR_TO_DATE(class_time, '%Y%m%d %H:%i:%s'), '%Y-%m-%d %H:%i:%s') 統一格式,再修改列類型為 DATETIME。WHERE STR_TO_DATE(col, ...) > ... 導致全表掃描,必須通過虛擬列或應用層轉換後查詢。