7
votes

Recherche entre les dates dans SQL avec JDBC?

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): XXX PRE>

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 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>

La déclaration réelle est ci-dessous: 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 commentaires

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) et ainsi de suite


3 Réponses :


11
votes

Utilisez des citations autour de vos dates: xxx pré>

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 + "' "


2 commentaires

J'ai pu résoudre le problème en ajoutant le '' et en modifiant également le format de date sur aaaa / mm / dd . Mon seul problème est que la requête n'est pas la date inclusive, je serais mieux à utiliser avec > = et <= ? EDIT: C'est en fait inclusifique que j'ai eu une erreur de code désolé. Tout travaille


@GNT entre est inclusif. Êtes-vous sûr que votre date de vente est en réalité une date date et non un horodatage (donc il contient le temps)? S'il s'agit d'un horodatage , la date est favorisée sur un horodatage (comme dans aaaa-mm-mm-dd 00: 00: 00.00000 , 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 . Sachez que certaines bases de données utilisent le terme date pour ce qui est réellement (dans les normes SQL et JDBC) horodatage .



0
votes

On dirait que vous devez exprimer des dates dans ce format:

Sélectionnez * à partir de la table où Datefield entre '2006-10-01' et '2006-11-30'

look ici aussi, n'oubliez pas que Google est votre ami! :)


0 commentaires

-1
votes
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);

1 commentaires

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 (...) à la place.