J'écris actuellement une application Java Swing qui lit les données dans un fichier de base de données MyOB et affiche certaines informations dans une table. J'ai été en mesure de générer avec succès les déclarations SQL requises, mais j'ai du mal à ajouter la possibilité de rechercher entre les dates (notre base de données est assez grande afin que nous essayions de limiter les résultats). Un exemple d'une de mes questions est ci-dessous (écrit en Java): J'ai deux dates (elles sont en réalité des cordes en Java mais sont formatées comme DD / mm / aaaa). p> J'ai essayé d'utiliser une autre clause La déclaration réelle est ci-dessous: p> et code> dans mon
où code> avec un
entre code> instruction, mais je reçois l'erreur suivante de JDBC
[MyOB ODBC] Erreur lors de la valeur littérale de l'opérande droit. Code> p>
rs = stmt.executeQuery("SELECT sales.InvoiceNumber, sales.ShipToAddress, sales.Date "
+ "FROM sales, customers "
+ "WHERE sales.CardRecordID = customers.CardRecordID "
+ "AND customers.Name = 'Cash Sales' "
+ "AND sales.Date BETWEEN " + sdate + " AND " + edate + " "
+ "ORDER BY sales.ShipToAddress ASC, sales.Date DESC"
+ ";");
3 Réponses :
Utilisez des citations autour de vos dates: ou il peut être plus sûr d'utiliser une instruction préparée (si les dates proviennent d'entrées non approuvées par exemple): P> "sales.Date >= '" + sdate + "' AND sales.Date < '" + edatePlusOne + "' "
J'ai pu résoudre le problème en ajoutant le '' code> et en modifiant également le format de date sur
aaaa / mm / dd code>. Mon seul problème est que la requête n'est pas la date inclusive, je serais mieux à utiliser avec
> = code> et
<= code>? EDIT: C'est en fait inclusifique que j'ai eu une erreur de code désolé. Tout travaille
@GNT entre code> est inclusif. Êtes-vous sûr que votre date de vente est en réalité une date
date code> et non un
horodatage code> (donc il contient le temps)? S'il s'agit d'un
horodatage code>, la date code> est favorisée sur un
horodatage code> (comme dans
aaaa-mm-mm-dd 00: 00: 00.00000 code>, et la condition entre les conditions n'inclut pas les éléments à la même date que la limite supérieure survenue après
00: 00: 00.00000 code>. Sachez que certaines bases de données utilisent le terme
date code> pour ce qui est réellement (dans les normes SQL et JDBC)
horodatage code>.
On dirait que vous devez exprimer des dates dans ce format: p>
Sélectionnez * à partir de la table où Datefield entre '2006-10-01' et '2006-11-30' P>
look ici aussi, n'oubliez pas que Google est votre ami! :) p>
Class.forName("com.mysql.jdbc.Driver"); connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/hospitall","root",""); PreparedStatement ps=connection.prepareStatement("select * from patient where patientid='"+txtpatientid.getText()+"'"); Statement stm=connection.createStatement(); ResultSet rs=ps.executeQuery(); if(rs.next()){ String patientid=txtpatientid.getText(); String str="select * from patient where patientid='"+patientid+"'"; ResultSet result=stm.executeQuery(str);
Vous ne devez pas utiliser la concaténation de chaîne. Cela ouvre la porte pour l'injection SQL et des trucs. Utilisez ps.setxxx (...) code> à la place.
Quelles sont les valeurs de sdate et d'édate?
Actuellement, date d'aujourd'hui SO 25/10/2013 (Ce sera le format standard de la date aussi toujours DD / mm / aaaa)
Je ne suis pas sûr, mais vous devez peut-être lancer la chaîne à ce jour. comme
... entre le casting ('"+ sdate +"' comme date) code> et ainsi de suite