Search code examples
javajdbcucanaccess

Date filtering using JDBC


What is the correct format for date filtering - JDBC to SQL

I have been trying to use the following with an MS-Access DB

SELECT doctorbusiness.dateofreport, 
       doctorbusiness.patientname, 
       doctorbusiness.labcomm, 
       doctorbusiness.xcomm, 
       doctorbusiness.spccomm, 
       doctorbusiness.ecgcomm 
FROM   doctorbusiness 
WHERE  doctorbusiness.doctorname = '"+selectedDoc+"' 
       AND (( doctorbusiness.dateofreport >= # "+sd+" # ) 
             AND ( doctorbusiness.dateofreport <= # "+ed+" # )) 

selectedDoc is in String and sD and eD in date format.

The query runs fine in MS-Access but gives the following exception :

net.ucanaccess.jdbc.UcanaccessSQLException: unknown token: 

UPDATE

public void printDoctorIncome() {

    Date startDate = easypath.docB_startDate_jxdp.getDate();
    Calendar calSD = Calendar.getInstance();
    calSD.setTime(startDate); // convert your date to Calendar object
    int daysToDecrement = -1;
    calSD.add(Calendar.DATE, daysToDecrement);
    Date real_StartDate = calSD.getTime();
    SimpleDateFormat sdF1 = new SimpleDateFormat("dd-MM-yyyy");
    String sD = sdF1.format(real_StartDate);
    JOptionPane.showMessageDialog(null, sD);

    Date endDate = easypath.docB_endDate_jxdp.getDate();
    Calendar calED = Calendar.getInstance();
    calED.setTime(endDate); // convert your date to Calendar object
    int daysToIncrement = +1;
    calED.add(Calendar.DATE, daysToIncrement);
    Date real_endDate = calED.getTime();
    SimpleDateFormat sdF2 = new SimpleDateFormat("dd-MM-yyyy");
    String eD = sdF2.format(real_endDate);
    JOptionPane.showMessageDialog(null, eD);

    String selectedDoc = easypath.drname_jlist.getSelectedValue().toString();
    String sql = "SELECT doctorBusiness.dateofreport, doctorBusiness.patientName, doctorBusiness.labComm, doctorBusiness.xComm, doctorBusiness.spcComm, doctorBusiness.ecgComm FROM doctorBusiness WHERE doctorBusiness.doctorname ='"+selectedDoc+"' AND (doctorBusiness.dateofreport >= ?"+sD+"? AND doctorBusiness.dateofreport <= ?"+eD+"?)";
    try {
        conn = connectDB.getConnection();
        psmt = conn.prepareStatement(sql);
        rs = psmt.executeQuery();
        doctorIncome.docIncomePrint_table.setModel(DbUtils.resultSetToTableModel(rs));
        doctorIncome dI = new doctorIncome();
        dI.setVisible(true);

    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "Error");
        e.printStackTrace();
    }

}

This is the code I am using


Solution

  • With JDBC better way to do it is use setDate/Time/Timestamp methods of PreparedStatement. And you shouldn't care about concrete DB's date format.

    Date dateFrom = ...
    Date dateTo = ...
    
    String sql = "... where myDate >= ? and myDate <= ? "
    
    preparedStatement.setDate(1, dateFrom);
    preparedStatement.setDate(2, dateTo);