2016-05-22 8 views
1

ich jdbcTemplate bin mit mit folgenden Abfrage und CodeWie kann ich die Ausführungszeit meiner SQL-Abfrage mit einem bestimmten Datumsformat vereinfachen und reduzieren?

String sql = select count(*) as count ,trunc(fin.fin_date) as dateAndTime from (select * from rec where rec_status='RECEIVED' and fin_date>sysdate-8) fin group by trunc(fin.fin_date) 

    try { 
     return jdbcTemplate.query(sql, new RowMapper<Chrt>() { 
      @Override 
      public Chrt mapRow(ResultSet rs, int rowNum) throws SQLException { 
       Chrt receive = new Chrt(); 
       java.util.Date date =(rs.getDate("dateAndTime")); 
       receive.setDate(date.toString()); 
       receive.setCount(rs.getInt("count")); 
       return receive; 
      } 
     }); 
    } catch (DataAccessException e) { 
     return null; 
    } 
} 

Es gibt mir Datum in einem Format wie 2016.05.19 aber ich brauche das Datum wie 19-MAY-16. Ist es möglich, dieses Format zu erhalten, ohne die Ausführungszeit zu erhöhen?

Wie kann ich das tun?

+1

Ein Java-'Datum' hat seine eigene interne Darstellung (und es ist kein 'String'). –

+0

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions180.htm – Hannes

Antwort

0

Anstelle der trunc-Funktion können Sie die TO_CHAR-Funktion verwenden. Es gibt Ihnen das Datum im angegebenen Format:

String sql = select count(*) as count ,TO_CHAR(fin.fin_date, 'DD-MON-YY') as dateAndTime from (select * from rec where rec_status='RECEIVED' and fin_date>sysdate-8) fin group by TO_CHAR(fin.fin_date, 'DD-MON-YY'); 

Dies wird die Leistung nicht signifikant beeinträchtigen.


Um die Leistung zu erhöhen, empfehle ich Ihnen, den Abfrageplan für die Abfrage zu betrachten. Um diesen Plan zu sehen, führen Sie einfach:

EXPLAIN PLAN FOR 
select count(*) as count ,TO_CHAR(fin.fin_date, 'DD-MON-YY') as dateAndTime from (select * from rec where rec_status='RECEIVED' and fin_date>sysdate-8) fin group by TO_CHAR(fin.fin_date, 'DD-MON-YY') 

in jedem Oracle SQL-Client und read the doc zu verstehen, warum es zu langsam ist und wie Leistungen zu verbessern. (Eine blinde Schätzung: Setzen Sie einen Index auf fin_date)

0

Warum nicht eine Abfrage anstelle von zwei verwenden?

select count(*) as count ,TO_CHAR(fin.fin_date, 'DD-MON-YY') as dateAndTime 
from rec 
where rec_status='RECEIVED' and fin_date>sysdate-8 
group by TO_CHAR(fin.fin_date, 'DD-MON-YY');