業務中常遇到日期以字符串 (VARCHAR) 存儲,需按日期排序/篩選。本文記錄 MySQL STR_TO_DATE 轉換排序實戰、格式符號對照、以及 Oracle TO_DATE/TO_CHAR 對比用法。
表 a,字段 class_time VARCHAR(20) 存儲格式:20170120 10:57:12 (YYYYMMDD HH:MI:SS)

STR_TO_DATE(str, format) -- str: 字符串日期 -- format: 格式字符串,需與數據實際格式完全匹配
| 符號 | 含義 | 示例 |
|---|---|---|
%Y | 四位年份 | 2017 |
%y | 兩位年份 | 17 |
%m | 月份 (01-12) | 01 |
%d | 日期 (01-31) | 20 |
%H | 小時 24制 (00-23) | 10 |
%h | 小時 12制 (01-12) | 10 |
%i | 分鐘 (00-59) | 57 |
%s | 秒 (00-59) | 12 |
%T | 時間 24制 (%H:%i:%s) | 10:57:12 |
%r | 時間 12制 (%h:%i:%s %p) | 10:57:12 AM |
SELECT STR_TO_DATE(class_time, '%Y%m%d %H:%i:%s') AS dt, class_time FROM a ORDER BY dt DESC;

WHERE STR_TO_DATE(class_time, '%Y%m%d %H:%i:%s') BETWEEN '2017-01-01' AND '2017-01-31'DATE(STR_TO_DATE(...)) = '2017-01-20'ALTER TABLE a ADD COLUMN class_dt DATETIME GENERATED ALWAYS AS (STR_TO_DATE(class_time, '%Y%m%d %H:%i:%s')) VIRTUAL; CREATE INDEX idx_class_dt ON a(class_dt);
| MySQL | Oracle | 含義 |
|---|---|---|
%Y | YYYY | 四位年 |
%m | MM | 月 |
%d | DD | 日 |
%H | HH24 | 24制時 |
%i | MI | 分 |
%s | SS | 秒 |
-- VARCHAR 轉 DATE 再轉 VARCHAR (指定輸出格式)
SELECT TO_CHAR(TO_DATE(m.ma_datetime, 'YYYY-MM-DD HH24:MI:SS'), 'YYYYMMDD')
FROM my_task m;
-- 關鍵點:TO_DATE 必須包含時分秒格式,否則報 ORA-01830
-- 錯誤示例: TO_DATE('2017-01-20', 'YYYY-MM-DD') -- 缺少時分秒
-- 正確: TO_DATE('2017-01-20 10:57:12', 'YYYY-MM-DD HH24:MI:SS')