kłopot z formatem daty przesyłanym do mysql

kłopot z formatem daty przesyłanym do mysql
BA
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 5 lat
  • Postów:47
0

Cześć, mam problem z formatem daty przesyłanym do mysql. Mam taką metodę w javie:

Kopiuj
 java.sql.Date konwertujDate(String sData){
 
        DateFormat format = new SimpleDateFormat("yyyy-mm-dd");
        java.util.Date mojaData = new java.util.Date();
        java.sql.Date sqlData;
 
        try{
            mojaData = format.parse(sData);
            sqlData = new java.sql.Date(mojaData.getTime());
        } catch(Exception e) {
            sqlData = null;
        }
 
 
        return sqlData;
   }  

Zapytanie w mysql zwraca poprawny wynik w gdy datę wpiszę ręcznie z apostrofami po obu stronach '2016-06-10', wartość przekazywana z javy nie ma tych apostrofów. Próbowałem szukać rozwiązań zarówno po stronie javy jak i sql, jednak nic nie przyniosło skutku.

Zapytanie:
SELECT DISTINCT
p.id_pomiar
FROM
ble.pomiar p
INNER JOIN
ble.lampa_elektronowa le
INNER JOIN
ble.typ t ON (t.id_typ = le.id_typ) AND (le.id_lampa = p.id_lampa)
WHERE
(t.typ = TYP) AND (le.nazwa_lampy = NAZWA_LAMPY) AND (p.data_pomiaru = DATA_POMIARU)
ORDER BY
p.id_pomiar ASC;

shagrin
Jaki jest typ danych w p.data_pomiaru, poza tym chyba masz zły format daty, nie powinno być "yyyy-MM-dd"?
BA
w bazie mam typ Date, ale masz rację zmieniłem format na "yyyy-MM-dd" i weszło, wcześniej zasugerowałem się okrojonymi informacjami ze stacka i byłem przekonany, ze właściwie zastosowałem te symbole, teraz zajrzałem do rzetelniejszego źródła i wszystko się już zgadza. Bardzo dziękuję :)
Black007
  • Rejestracja:ponad 21 lat
  • Ostatnio:dzień
0

Hej. Wrzuć kod, gdzie wykorzystujesz tę metodę.
W jaki sposób populujesz statement?


"Nie popełnia błędów tylko ten, kto nic nie robi"
BA
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 5 lat
  • Postów:47
0
Kopiuj
void uzupelnianieComboBox(String ZAPYTANIE, String NAZWA_LAMPY, String TYP, String DATA, javax.swing.JComboBox jComboBox, String nazwa_zmiennej ){
        
        List<String> zawartoscCB = new ArrayList<>();
        String dana = null;
        java.sql.Date sqlData = konwertujDate(DATA);
        System.out.println(sqlData);
        
        Integer danaint = 0;
        
        
        MojResultSet mrs = new MojResultSet();
        ResultSet rs = mrs.wybierz(ZAPYTANIE, 0, NAZWA_LAMPY, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TYP, sqlData, 0, 0, 0, 0);
        try{
            while(rs.next()){
                if("nazwa_lampy".equals(nazwa_zmiennej))
                    dana = rs.getString(nazwa_zmiennej);
                if("data_pomiaru".equals(nazwa_zmiennej))
                    dana = rs.getDate(nazwa_zmiennej).toString();
                if ("id_pomiar".equals(nazwa_zmiennej)){
                    danaint = rs.getInt(nazwa_zmiennej);
                    dana = danaint.toString();
                }
                zawartoscCB.add(dana);
                
            }
        } catch(SQLException ex){
            Logger.getLogger(Menu.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        if(zawartoscCB.isEmpty()){
            jComboBox.addItem("brak");
        }
        else{
            for(String b: zawartoscCB){
                jComboBox.addItem(b);
            }
        }
        zawartoscCB.clear();
   }  
Kopiuj
package BLE;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;

public class MojResultSet {
    
    Connection conn = null;
    ResultSet rs = null;
    CallableStatement pstmt = null;
    String polaczenieURL = "jdbc:mysql://localhost:3306/ble?zeroDateTimeBehavior=convertToNull&useSSL=false";
    String jkomunikat;
    
    
    public ResultSet wybierz(String v1, int v2, String v3, int v4, int v5, int v6, float v7, float v8, float v9, float v10, float v11, float v12, int v13, String v14, 
            java.sql.Date v15, int v16, int v17, int v18, int v19){
        
        try{
            conn = DriverManager.getConnection(polaczenieURL,"root","1234");
            Class.forName("com.mysql.jdbc.Driver"); // ustawienie sterownika mysql
            pstmt = conn.prepareCall("{call ble.procedura_lampa(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
            pstmt.setString(1, v1);
            pstmt.setInt(2, v2);
            pstmt.setString(3, v3);
            pstmt.setInt(4, v4);
            pstmt.setInt(5, v5);
            pstmt.setInt(6, v6);
            pstmt.setFloat(7, v7);
            pstmt.setFloat(8, v8);
            pstmt.setFloat(9, v9);
            pstmt.setFloat(10, v10);
            pstmt.setFloat(11, v11);
            pstmt.setFloat(12, v12);
            pstmt.setInt(13, v13);
            pstmt.setString(14, v14);
            pstmt.setDate(15, v15);
            pstmt.setInt(16, v16);
            pstmt.setInt(17, v17);
            pstmt.setInt(18, v18);
            pstmt.setInt(19, v19);
            pstmt.setString(20, "");
               
            rs = pstmt.executeQuery();
               
            pstmt.registerOutParameter(20, java.sql.Types.VARCHAR); 
            String jkomunikat = pstmt.getString(20);
            if(jkomunikat != null && !jkomunikat.isEmpty()){
                JOptionPane.showMessageDialog(null, jkomunikat);
                 
            }  
        } catch(SQLException wyjatek){
            System.out.println("SQLException: " + wyjatek.getMessage());
            System.out.println("SQLState: " + wyjatek.getSQLState());
            System.out.println("VendorError: " + wyjatek.getErrorCode());   
        } catch(ClassNotFoundException wyjatek){
            System.out.println("Problem ze sterownikiem");
        }
         
        return rs;
    }
    
    public void zamknijPolaczenie() throws SQLException {
        conn.close();
    }
    public void zamknijCallableStatement() throws SQLException {
        pstmt.close();
    }

    public String zwrocKomunikat(){
        return jkomunikat;
    }

    
    
}

od razu dziękuję za odzew :)

Black007
  • Rejestracja:ponad 21 lat
  • Ostatnio:dzień
0

Jako parametr v16 przekazujesz 0.
A metodzie robisz z tego datę.

Generalnie "gratuluję" nazewnictwa.
Nie nazywaj tak parametrów (na honor!), bo potem masz takie problemy.
Poczytaj proszę o konwencjach nazewniczych w javie, bo oczy bolą od czytania i łatwo popełnić takie błędy.
Poza tym mieszasz warstwy, warstwa danych pomieszana z widokiem - JOptionPane w warstwie danych...
Nie połapiesz się w tym w przyszłości, jeśli program będzie miał więcej klas.


"Nie popełnia błędów tylko ten, kto nic nie robi"
edytowany 1x, ostatnio: Black007
BA
kolejność jest dobra, błąd był w formacie daty. Rzeczywiście powinienem nadać lepszą nazwę chociaż 2-3 parametrom takim jak data, byłoby prościej, bo reszta to mierzone parametry sprzętu elektronicznego, same prądy i napięcia na różnych elementach, więc używanie tych nazw i tak nie służyłoby czytelności. Dopiero się uczę, to jest tak naprawdę mój pierwszy samodzielny projekt, więc każda uwaga jest cenna. Dzięki

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.