場景
dt : datetime (如 2014-11-11 00:00:00.000)
time : varchar(10) (如 12:50)
- 需查:組合時間 > 當前時間 - 2 小時
SQL Server 寫法
SELECT * FROM [table]
WHERE CAST(CONVERT(varchar(12), dt, 100) + ' ' + time AS datetime) < DATEADD(hour, -2, GETDATE())
解析
CONVERT(varchar(12), dt, 100) → 'Nov 11 2014' (格式 100)。
- 拼接
' ' + time → 'Nov 11 2014 12:50'。
CAST(... AS datetime) 解析為完整時間點。
DATEADD(hour, -2, GETDATE()) 獲取兩小時前時間。
MySQL 寫法
SELECT * FROM `table`
WHERE STR_TO_DATE(CONCAT(DATE_FORMAT(dt, '%Y-%m-%d'), ' ', time), '%Y-%m-%d %H:%i') < DATE_SUB(NOW(), INTERVAL 2 HOUR)
最佳實踐
- 表設計階段合併為單一 datetime 列,避免運行時拼接解析,利於索引、查詢性能、時區處理。
- 若無法改表,建立**計算列/視圖/函數索引**物化組合時間。
- 注意
varchar(10) 可能包含秒 12:50:30,格式需兼容。