如何使用jdbcTemplate获取小写字母的月份?

时间:2016-06-01 14:54:54

标签: java spring oracle jdbctemplate

我正在使用的查询是

        String sql=select trim(CdateTo) cdate,
        count(case when Verified = 'WithGrant' then 1 end) as grant,
        count(case when Verified = 'WithDiscount' then 1 end) as CC
        from mse where Verified IN ('WithDiscount','WithGrant') and 
        CdateTo > SYSDATE - 9 
        GROUP BY trim(CdateTo) 
        ORDER BY TO_DATE(cdate,'DD/MM/YYYY') 

和spring jdbcTemplate代码类似

        try {
            return jdbcTemplate.query(sql, new RowMapper<Trif>() {
                @Override
                public Trif mapRow(ResultSet rs, int rowNum) throws SQLException {
                    Trif trif = new Trif();
                    *************some code*******
                    Trif.setDate(rs.getString("cdate"));
                    ***********someCode*********
                    return trif;
                }
            });
        } catch (DataAccessException e) {
            return null;
        }

这回复了我的日期,如31-MAY-16 在我想要的地方应该像5月31日那样回到我那里,五月份首都在首都出现,其他人则在小  我怎么能实现这个目标?

2 个答案:

答案 0 :(得分:0)

如果您可以假设日期始终格式化为DD-MONTH-YY,则此代码应该适合您:

    private String capitalizeMonth(String s) {
        char[] c = s.toLowerCase().toCharArray();
        c[s.indexOf('-') + 1] = Character.toTitleCase(c[s.indexOf('-') + 1]);
        return new String(s);
    }

答案 1 :(得分:0)

正如已经建议的那样,你可以在Java端处理这个案例。 但是,在您的查询中,有一些地方需要注意。

你有

select trim(CdateTo) cdate,

这意味着只要CdateTo是varchar本身就返回一个很好的varchar。 但是

CdateTo > SYSDATE - 9

表示在其中一行中有一个隐式类型转换 - 这取决于NLS设置。一旦默认设置发生变化 - 您的代码可能会崩溃。

现在有了原始问题。 Oracle有一个非常好的函数INITCAP,可以完成你真正需要的工作。做这样的事情 select initcap(trim(CdateTo)) cdate可能有帮助。

但是,如果CdateTo列的类型为DATE,那么处理问题的正确方法是:

select trim(to_char(CdateTo,'dd-Mon-yy')) cdate,

注意格式掩码和Mon中的大写字母M - 这将使您的结果保持一致且独立于会话/系统设置的变化