如何对存储格式不同的两个表的日期文本字段执行join关联查询
解决方案
核心思路是将两个不同格式的文本时间字段转换为相同的日期类型/统一格式的字符串后再进行等值关联,不需要修改原表结构,仅在查询语句中做实时转换即可,以下是不同数据库环境的实现示例:
MySQL 环境
SELECT a.a_d FROM A a JOIN B b ON STR_TO_DATE(a.a_d, '%Y-%m-%d %H:%i:%s') = STR_TO_DATE(b.a_d, '%d-%b-%Y');
STR_TO_DATE 函数可以按照指定格式把文本转成日期类型,%b 对应3位英文月份缩写的匹配规则。
PostgreSQL 环境
SELECT a.a_d FROM A a JOIN B b ON TO_DATE(a.a_d, 'YYYY-MM-DD HH24:MI:SS') = TO_DATE(b.a_d, 'DD-Mon-YYYY');
PostgreSQL 使用TO_DATE函数做转换,月份缩写匹配符为Mon,如果字段中存储的是小写月份,可将格式调整为DD-mon-YYYY适配。
Oracle 环境
SELECT a.a_d FROM A a JOIN B b ON TO_DATE(a.a_d, 'YYYY-MM-DD HH24:MI:SS') = TO_DATE(b.a_d, 'DD-MON-YYYY');
Oracle默认匹配大写的英文月份缩写,如果字段中存储的是小写月份,可增加语言参数适配:TO_DATE(b.a_d, 'DD-mon-YYYY', 'NLS_DATE_LANGUAGE = ENGLISH')
SQL Server 环境
SELECT a.a_d FROM A a JOIN B b ON CONVERT(DATE, a.a_d, 120) = CONVERT(DATE, b.a_d, 106);
120是yyyy-mm-dd hh:mi:ss格式对应的格式码,106是dd mon yyyy格式对应的格式码,转换为日期类型后可直接比对。
注意事项
- 建议先单独验证两个字段的转换逻辑是否正常,若库中存在不符合格式的脏数据,转换函数可能会报错。
- 大表关联时转换操作会导致字段上的原有索引失效,查询性能可能下降,条件允许的话可通过新增函数索引优化查询效率。
内容的提问来源于stack exchange,提问作者user3668129
相关产品推荐
相关产品推荐

