BIRT报表日期格式转换求助:dd-mm-yyyy转MON-YYYY失败
解决BIRT中日期格式转换匹配的问题
我来帮你理清楚这个问题,你现在的问题核心是查询逻辑的格式匹配完全搞反了,咱们一步步拆解和解决:
为什么你的当前写法不生效?
你执行的查询语句是:
select ……. where VARCHAR_FORMAT(fieldname,'MON-YYYY') = '2017-05-15';
这里的问题非常明显:
- 数据库中
fieldname的值是2017-05-15 07:30:00.0,用VARCHAR_FORMAT(fieldname,'MON-YYYY')格式化后会得到MAY-2017(或者数据库本地化对应的月份缩写,比如中文环境可能是5月-2017) - 你却把它和
2017-05-15这种日期字符串对比,两者格式完全不匹配,自然查不到结果。
正确的解决方案
根据你的需求(将用户输入的dd-mm-yyyy日期转换为MON-YYYY格式后匹配数据库字段),有两种可行方案:
方案1:统一两边的格式化格式(直接匹配月年)
先把用户输入的dd-mm-yyyy格式字符串转换为日期类型,再格式化为MON-YYYY,和数据库字段格式化后的结果做对比:
SELECT ... WHERE VARCHAR_FORMAT(fieldname, 'MON-YYYY') = VARCHAR_FORMAT(TO_DATE(?,'DD-MM-YYYY'), 'MON-YYYY')
- 这里的
?代表BIRT中用户输入的日期参数(如果用户输入是15/05/2017,记得把TO_DATE的格式改为DD/MM/YYYY,和输入格式对应) - 两边都转成
MON-YYYY格式后,就能正确匹配同一月份的所有数据。
方案2:使用日期范围查询(推荐,性能更优)
如果你的fieldname是日期/时间类型,强烈推荐用范围查询,因为格式化字段会导致数据库无法使用索引,而范围查询可以利用字段索引大幅提升性能:
SELECT ... WHERE fieldname >= DATE_TRUNC('MONTH', TO_DATE(?,'DD-MM-YYYY')) AND fieldname < DATE_TRUNC('MONTH', ADD_MONTHS(TO_DATE(?,'DD-MM-YYYY'), 1))
这个逻辑是:
- 把用户输入的日期转成当月的第一天(比如
15/05/2017转成2017-05-01 00:00:00) - 查询字段大于等于当月第一天,同时小于下一个月的第一天(
2017-06-01 00:00:00) - 这样就能匹配整个5月的所有数据,效率比格式化字段高很多。
内容的提问来源于stack exchange,提问作者max092012
相关产品推荐
相关产品推荐

