# WHERE datetime < (util.Date | sql.Date | sql.Timestamp | dateString)



## allapow (2. Apr 2012)

hallo Forum,

Code sagt mehr als tausend Worte:

```
java.util.Date actualDate = new java.util.Date();
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = dateFormat.format(actualDate);
        java.sql.Date actualDateSql = new java.sql.Date(actualDate.getTime());
        java.sql.Timestamp actualTimeSql = new java.sql.Timestamp(actualDate.getTime());
        System.out.println("Date: " + actualDate.toString());
        System.out.println("SQL-Date: " + actualDateSql);
        System.out.println("SQL-Timestamp: " + actualTimeSql);
        System.out.println("format-Date: " + dateString);
        try {
            PreparedStatement pstmt = con.prepareStatement("SELECT * FROM ? WHERE (end_datetime < ?)");
            pstmt.setString(1, tableName);
//            pstmt.setDate(2, actualDateSql);
//            pstmt.setTimestamp(2, actualTimeSql);
            pstmt.setString(2, dateString);
            System.out.println("PreparedStatement: " + pstmt.toString());
            ResultSet result = pstmt.executeQuery();
            if (result.first()) {
                System.out.println("Result: " + result);
                return result;
            }
        } catch (SQLException e) {
            logger.error(e.getMessage());
        }
```

die Ausgabe davon ist:

```
Date: Mon Apr 02 13:40:52 CEST 2012
SQL-Date: 2012-04-02
SQL-Timestamp: 2012-04-02 13:40:52.73
format-Date: 2012-04-02 13:40:52
PreparedStatement: com.mysql.jdbc.JDBC4PreparedStatement@4b0ab323: SELECT * FROM 'dev_votingp_wettsys' WHERE (end_datetime < '2012-04-02 13:40:52')
```

die Logdatei sieht immer so aus (auch wenn ich den Timestamp benutze):

```
ERROR - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''dev_votingp_wettsys' WHERE (end_datetime < '2012-04-02 13:40:52')' at line 1
```

das Datumsfeld, mit dem ich den Vergleich möchte, ist ein DATETIME Feld.

beim Googeln habe ich das hier gefunden (brachte mich auf die Timestamp-geschichte):
How to store Java Date to Mysql datetime...? - Stack Overflow

Das ResultSet ist bei jeder Variante (auskommentierte Zeilen) null.

Und warum will es nicht wenn ich den String als zweites StatementArgument einfüge? Beispiel eines Datetimes in der DB: 2012-04-12 11:14:01

MySQL :: MySQL 5.1 Referenzhandbuch :: 25.3.4.3 Datentypen von Java, JDBC und MySQL
...meint auch, daß es mit String gehen sollte. Und Timestamp ist wohl zu bevorzugen.

Hat da jemand eine Lösung hier?


----------



## SlaterB (2. Apr 2012)

was läßt dich überhaupt vermuten dass die Fehlermeldung etwas mit dem Date zu tun hat?
leider ist die nicht deutlich, aber es wäre schon eine gewisse geistige Leistung, einen nicht zu parsenden SQL noch genauer zu analysieren und Fehler zu vermuten,
anderseits könnte auf den ersten konkreten Fehler auch viel deutlicher hingewiesen werden

ganz ohne Date "SELECT * FROM ?" führt genauso zum Fehler oder?
das Problem ist dass du die Tabelle variabel machen willst, beim Tabellennamen als String 'dev_votingp_wettsys'
setzt dann auch die Fehlermeldung ein, wenn man ganz genau hinschaut

das funktioniert nicht, Tabellenname, Attributnamen usw. müssen fest in das SQL rein

--------

beim Date kannst du aber auch noch vielleicht besser werden, was spricht gegen pstmt.setDate() oder ähnliches? 
dann musst du überhaupt nicht darüber nachdenken wie das Date zu formatieren ist,
macht hoffentlich der JDBC-Treiber richtig

ach ja, hast du auch schon und auskommentiert, vielleicht weil du da den Fehler vermutet hast


----------



## allapow (2. Apr 2012)

du hast Recht, dank dir.

Weil die Fehlermeldung auf das Ende des QueryStrings hinwies habe ich dort natürlich auch den Fehler gesucht. Und weil ich an die Fehlermeldung glaubte habe ich im Dunkel irgendetwas gesucht. Ja und dann bin ich hier ins Forum gekommen weil ich im Dunkel nichts gefunden habe 

Den Tabellenname wollte ich variabel machen weil der sich ändern kann. Jetzt mache ich es ohne PreparedStatement, das funktioniert.


----------

