You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:02:05