Avatar billede langkiller Nybegynder
02. oktober 2012 - 21:57 Der er 25 kommentarer og
1 løsning

"matematiske" udtryk i et sql statement

Har forsøgt mig med følgende kode, men det ser ikke ud til at fungere korrekt.

int currentTimestamp = (int)System.currentTimeMillis()/1000;
                       
PreparedStatement setUserOffline = con.prepareStatement("UPDATE users SET status = 'offline' WHERE "+currentTimestamp+"-lastMessage > 90");
setUserOffline.executeUpdate();


Den skal opdaterer feltet status til "offline" i databasen for alle brugerer hvor forskellen mellem det nuværende timestamp og det der står i databasen er mere end 90 (sekunder)

håber i kan forstå min kringlede forklaring og evt. har en løsning
Avatar billede langkiller Nybegynder
02. oktober 2012 - 21:59 #1
er ikke helt sikker på om jeg skulle have placeret den unger SQL eller her i Java, men nu blev det altså bare her :b
Avatar billede arne_v Ekspert
02. oktober 2012 - 22:04 #2
Du skal nok have fat i en DATEDIFF funktion for din databases SQL dialekt.
Avatar billede arne_v Ekspert
02. oktober 2012 - 22:04 #3
Hvilken database bruger du?
Avatar billede arne_v Ekspert
02. oktober 2012 - 22:05 #4
For MySQL f.eks.:

PreparedStatement setUserOffline = con.prepareStatement("UPDATE users SET status = 'offline' WHERE DATEDIFF(?,lastMessage) > 90");
Avatar billede langkiller Nybegynder
02. oktober 2012 - 22:07 #5
Jeg bruger en mySQL database. vil lige prøve med dit eksempel
Avatar billede arne_v Ekspert
02. oktober 2012 - 22:13 #6
Bemaerk at du skal bruge setParameter, da jeg brugte et ? som placeholder.
Avatar billede langkiller Nybegynder
02. oktober 2012 - 22:14 #7
Prøvede med følgende:

int currentTimestamp = (int)System.currentTimeMillis()/1000;
                       
                        PreparedStatement setUserOffline = con.prepareStatement("UPDATE users SET status = 'offline' WHERE DATEDIFF('"+currentTimestamp+"',lastMessage) > 90");
                        setUserOffline.executeUpdate();


Men den catcher bare og giver mig min egen fejlkode. hmm er min syntakst rigtig nok eller?
Avatar billede langkiller Nybegynder
02. oktober 2012 - 22:16 #8
ahh havde ikke lige set du havde skrevet igen.. googler lige lidt på setParameter
Avatar billede arne_v Ekspert
02. oktober 2012 - 22:18 #9
Jeg gaetter paa at currentTimestamp komemr ind i forkert format.

Hvilket setParameter tilfaeldigvis ogsaa loeser!
Avatar billede langkiller Nybegynder
02. oktober 2012 - 22:22 #10
Den kan ikke compile dette :

                        int currentTimestamp = (int)System.currentTimeMillis()/1000;
                       
                        PreparedStatement setUserOffline = con.prepareStatement("UPDATE users SET status = 'offline' WHERE DATEDIFF(?,lastMessage) > 90");
                        setUserOffline.setParameter(1, currentTimestamp);
                        setUserOffline.executeUpdate();


prøvede også med setUserOffline.setInt(1, currentTimestamp);
Avatar billede arne_v Ekspert
02. oktober 2012 - 22:29 #11
setUserOffline.setParameter(1, currentTimestamp);

->

setUserOffline.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
Avatar billede langkiller Nybegynder
02. oktober 2012 - 22:44 #12
den catcher stadig bare ved setUserOffline.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
Avatar billede arne_v Ekspert
02. oktober 2012 - 23:23 #13
hvad betyder "catcher stadig" helt praecist?

compile error eller runtime error?

hvilken fejl besked?
Avatar billede langkiller Nybegynder
02. oktober 2012 - 23:29 #14
det betyder at det ovenstående er i en try-catch og den hopper til catch fordi den ikke kan gennemføre det... ved ikke hvorfor, får ikke nogen fejl besked ud. hvordan får man den til at udskrive fejlen i sådan en try catch ?
try {
} catch (Exception e) {
            System.out.println("fejl i userStatus.java update");
        }
Avatar billede arne_v Ekspert
02. oktober 2012 - 23:59 #15
System.out.println("fejl i userStatus.java update" + e);
Avatar billede langkiller Nybegynder
03. oktober 2012 - 00:02 #16
den giver
updatecom.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1349215288'
Avatar billede arne_v Ekspert
03. oktober 2012 - 00:13 #17
Hmm.

Det maa jeg vist lige eksperimentere lidt med.
Avatar billede arne_v Ekspert
03. oktober 2012 - 00:57 #18
foelgende virker her:

package october;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;

public class DateDiff {
    public static void main(String[] args) throws SQLException {
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost/Test", "roor", "");
        Statement stmt = con.createStatement();
        stmt.executeUpdate("CREATE TABLE dd (id INTEGER NOT NULL, d DATETIME, PRIMARY KEY(id))");
        PreparedStatement pstmt1 = con.prepareStatement("INSERT INTO dd VALUES(?,?)");
        pstmt1.setInt(1, 1);
        pstmt1.setTimestamp(2,  new Timestamp(System.currentTimeMillis()));
        pstmt1.executeUpdate();
        pstmt1.setInt(1, 2);
        pstmt1.setTimestamp(2,  new Timestamp(System.currentTimeMillis() - 7 * 24 * 60 * 60 * 1000L));
        pstmt1.executeUpdate();
        pstmt1.setInt(1, 3);
        pstmt1.setTimestamp(2,  new Timestamp(System.currentTimeMillis() - 14 * 24 * 60 * 60 * 1000L));
        pstmt1.executeUpdate();
        pstmt1.close();
        PreparedStatement pstmt2 = con.prepareStatement("SELECT id FROM dd WHERE DATEDIFF(?,d) > ?");
        pstmt2.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
        pstmt2.setInt(2, 5);
        ResultSet rs2 = pstmt2.executeQuery();
        while(rs2.next()) {
            System.out.println(rs2.getInt(1));
        }
        rs2.close();
        pstmt2.close();
        stmt.executeUpdate("DROP TABLE dd");
        stmt.close();
        con.close();
    }
}
Avatar billede arne_v Ekspert
03. oktober 2012 - 00:58 #19
hvilken type er feltet lastMessage ?
Avatar billede langkiller Nybegynder
03. oktober 2012 - 13:43 #20
lastMessage er af typen INT

kan simpelthen ikke se hvad du gør anderledes... jeg har:

PreparedStatement setUserOffline = con.prepareStatement("UPDATE users SET status = 'offline' WHERE DATEDIFF(?,lastMessage) > 90");
                        setUserOffline.setTimestamp(1, new Timestamp(System.currentTimeMillis()/1000));
                        setUserOffline.executeUpdate();


og får stadig:

fejl i userStatus.java updatecom.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1349264494'
Avatar billede arne_v Ekspert
03. oktober 2012 - 14:15 #21
ah INT ...........

proev:

PreparedStatement setUserOffline = con.prepareStatement("UPDATE users SET status = 'offline' WHERE ? - lastMessage > 90 * 24 * 60 * 60");
setUserOffline.setInt(1, (int)(System.currentTimeMillis()/1000));
setUserOffline.executeUpdate();
Avatar billede langkiller Nybegynder
03. oktober 2012 - 20:31 #22
det virker perfekt .. tak for hjælpen! :)

forresten ved du hvordan man kan få en executable jar file til at kunne åbnes af en bestemt java version? programmet ville ikke åbne på en anden computer pga en anden java version
Avatar billede langkiller Nybegynder
03. oktober 2012 - 20:32 #23
har brugt eclipse til at eksporterer med.
Avatar billede arne_v Ekspert
03. oktober 2012 - 20:37 #24
jeg ville nok forsoege at undgaa at bruge INT til tidspunkter, men ....
Avatar billede arne_v Ekspert
03. oktober 2012 - 20:40 #25
Et Java program bygget til version X kan koere paa X eller nyere (X+1, X+2 etc.).

Saa tricket er at bygge til den laveste version det skal kunne koere paa.

Du kan godt bygge til en lavere version end den du selv koerer med.

Ved command line build er det -target (og -source).

I Eclipse er det project, properties, java compiler.
Avatar billede arne_v Ekspert
03. oktober 2012 - 20:40 #26
og svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester