Oracle按年月统计数据查询无结果,请求排查SQL问题
问题原因及解决办法
咱们先弄明白为啥你的SQL查不到结果:
你的trxdate字段应该是包含具体日期+时间的类型(比如DATE、DATETIME这类),而to_date('2018-04','yyyy-mm')会生成2018年4月1日00:00:00这个精确的时间点。只有当trxdate完全等于这个时间点的记录才会被统计,四月里其他日期的记录自然匹配不上,所以返回0结果。
下面给你几种不同数据库下的正确写法,优先推荐范围查询的方式(因为能利用trxdate上的索引,性能更好):
Oracle数据库
- 方法1:用
TRUNC截断日期到月份
SELECT COUNT(*) FROM db.trx WHERE TRUNC(trxdate, 'MM') = TO_DATE('2018-04', 'yyyy-mm');
- 方法2:范围查询(推荐)
SELECT COUNT(*) FROM db.trx WHERE trxdate >= TO_DATE('2018-04-01', 'yyyy-mm-dd') AND trxdate < TO_DATE('2018-05-01', 'yyyy-mm-dd');
MySQL数据库
- 方法1:用
DATE_FORMAT转换为年月字符串匹配
SELECT COUNT(*) FROM db.trx WHERE DATE_FORMAT(trxdate, '%Y-%m') = '2018-04';
- 方法2:范围查询(推荐)
SELECT COUNT(*) FROM db.trx WHERE trxdate >= '2018-04-01' AND trxdate < '2018-05-01';
PostgreSQL数据库
- 方法1:用
DATE_TRUNC截断到月份
SELECT COUNT(*) FROM db.trx WHERE DATE_TRUNC('month', trxdate) = TO_DATE('2018-04', 'yyyy-mm');
- 方法2:范围查询(推荐)
SELECT COUNT(*) FROM db.trx WHERE trxdate >= '2018-04-01'::DATE AND trxdate < '2018-05-01'::DATE;
额外提醒:如果你的trxdate字段建了索引,尽量用范围查询的写法,因为函数处理字段的方式可能会让索引失效,拖慢查询速度。
内容的提问来源于stack exchange,提问作者illogic
相关产品推荐
相关产品推荐

