Java 通过Netbeans在mySQL中以dd/MM/yyyy格式存储日期,但mySQL通常采用yyyy/MM/dd

Java 通过Netbeans在mySQL中以dd/MM/yyyy格式存储日期,但mySQL通常采用yyyy/MM/dd,java,swing,Java,Swing,我输入了以下代码。我的目标是以dd/MM/yyyy格式在mySQL中存储日期。但是mySQL通常采用yyyy/MM/dd String d=(((JTextField)jDateChooser1.getDateEditor().getUiComponent()).getText()); Statement stmt = db.conn.createStatement(); String sql = "insert into diag.current " +

我输入了以下代码。我的目标是以dd/MM/yyyy格式在mySQL中存储日期。但是mySQL通常采用yyyy/MM/dd

    String d=(((JTextField)jDateChooser1.getDateEditor().getUiComponent()).getText()); 
    Statement stmt = db.conn.createStatement(); 
    String sql = "insert into diag.current " +     
                 "values'"+col1+"','"+col2+"','"+java.sql.Date.valueOf(d)+"','"+col4+"')";    
    stmt.executeUpdate(sql);
我右键单击jDateChooser1并单击自定义代码,然后输入:

jDateChooser1= new com.toedter.calendar.JDateChooser("dd/MM/yyyy","##/##/####",'_');

现在请让我知道我在哪里犯了错误。如果有人能解决这个问题,我将不胜感激。提前谢谢。我希望我描述得很清楚……

应该是这样的东西,如下所示。最好列出列名,以便将来对表进行更改,并提高可读性。
在代码中丢失。使用准备好的语句可以转义字符串并防止SQL注入。对于日期、整数等也很有用

java.sql.Date date = new java.sql.Date(SimpleDateFormat("dd/MM/yyyy").parse(d).getTime());

PreparedStatement stmt = db.conn.createPreparedStatement(); 
String sql = "INSERT INTO diag.current (COL1, COL2, COL3, COL4) VALUES(?, ?, ?, ?)";
PreparedStatement stmt = db.conn.createPreparedStatement();`
stmt.setString(1, col1);
stmt.setString(2, col2);
stmt.setDate(3, date);
stmt.setString(4, col4);
stmt.executeUpdate();
stmt.close();
我已使用您的帮助编辑了我的程序,如下所示:

java.sql.Date date = new java.sql.Date(SimpleDateFormatter("dd/MM/yyyy").parse(d).getTime());
PreparedStatement stmt = db.conn.prepareStatement(); 
String sql = "INSERT INTO diag.current (name, patientID, address, sex, phone, vip, email, purpose, history, tests, doc, charges, status, dob, nextapp) " +     
"VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";    
PreparedStatement stmt = db.conn.createPreparedStatement(); 
stmt.setString(1, name);
stmt.setString(2, id);
stmt.setString(3, add);
stmt.setString(4, sex);
stmt.setString(5, ph);
stmt.setString(6, vip);
stmt.setString(7, mail);
stmt.setString(8, pur);
stmt.setString(9, phis);
stmt.setString(10, tests);
stmt.setString(11, dc);
stmt.setInt(12, total);
stmt.setString(13, status);
stmt.setDate(14, date);
stmt.setDate(15, date);
stmt.executeUpdate();
stmt.close();
问:但是
SimpleDataFormatter
createPreparedStatement
不支持,我应该使用哪个导入

答:错别字,应该是

java.text.SimpleDateFormat
con.prepareStatement
从MySQL手册-

日期类型用于包含日期部分但不包含时间部分的值。MySQL检索并以“YYYY-MM-DD”格式显示日期值。支持的范围为“1000-01-01”到“9999-12-31”

DATETIME类型用于同时包含日期和时间部分的值。MySQL以“YYYY-MM-DD HH:MM:SS”格式检索和显示DATETIME值。支持的范围为“1000-01-01 00:00:00”到“9999-12-31 23:59:59”

时间戳数据类型用于同时包含日期和时间部分的值。时间戳的范围为“1970-01-01 00:00:01”UTC到“2038-01-19 03:14:07”UTC

MySQL将时间戳值从当前时区转换为UTC进行存储,然后从UTC转换回当前时区进行检索。(对于其他类型(如DATETIME)不会发生这种情况。)默认情况下,每个连接的当前时区是服务器的时间

MySQL允许对指定为字符串的值使用“宽松”格式,其中任何标点字符都可以用作日期部分或时间部分之间的分隔符。例如,YYYY/MM/DD可以作为日期

因此,似乎必须创建YYYY-MM-DD格式的文本日期才能将日期插入MySQL


当您使用setDate方法时,PreparedStatement应该为您从java.sql.Date执行此转换。

Date
应该使用
java.sql.Date
存储在数据库中,那么格式是不相关的。您可能需要验证列类型是否确实能够存储
Date
值。它将ld还强烈建议您在处理数据库时使用
PreparedStatement
s是的,我可以打印字符串d,但不能将其存储在数据库中…我已经在数据库中使用了java.sql.Date以及PreparedStatement。列类型肯定是Date…字符串d的值是多少?它以什么方式不起作用?您知道吗insert时出错?它是否将数据存储在数据库中?不,您没有使用PreparedStatement。请读取您自己的代码。其中没有PreparedStatement。读取setDate()接受java.sql.Date,而不是java.util.Date。几乎+1。如果将格式更改为dd/MM/yyyy,此程序将不起作用,因为sql只接受yyyy/MM/dd。我想我已经明确了真正的问题所在。@sudipta.dey:该格式仅用于将用户提供的字符串转换为日期对象。之后,日期对象将传递给JDBC驱动程序,这样做是正确的。日期格式是不相关的。请相信那些回答问题的人,他们(几乎)被投票支持,并且拥有良好的声誉,而不是甚至不测试他们的解决方案。确实,这并没有解决日期格式问题,但这仍然是一种更好的插入方式。您最好听取建议。(post现在也被编辑来解析日期)@sudipta.dey一个可以理解的错误:在预先准备好的语句的引擎盖下发生的不仅仅是用
toString()替换
。事实上,SQL引擎可以有自己的预先准备好的语句,java驱动程序只需经过很长时间(自1970年以来的秒)就可以得到一个日期左右。
dateChooserDialog1.showDialog(this.getFrame());
Calendar d=dateChooserDialog1.getSelectedDate();

SimpleDateFormat sdf=new SimpleDateFormat("DD-MM-YYYY");
String s=d.toString();
String dd=s;
String mm=s;
String yyyy=s;
int i=dd.lastIndexOf("DAY_OF_MONTH");
dd=dd.substring(i+13,i+16);
dd=dd.substring(0,dd.lastIndexOf(","));

int j=mm.indexOf("MONTH");
mm=mm.substring(j+6,j+9);
mm=mm.substring(0,mm.lastIndexOf(","));
j=Integer.parseInt(mm);
mm=String.valueOf(j+1);

int z=yyyy.indexOf("YEAR");
yyyy=yyyy.substring(z+5,z+10);
yyyy=yyyy.substring(0,yyyy.lastIndexOf(","));

//s.substring(busyIconIndex, busyIconIndex);

String dob=dd+"/"+mm+"/"+yyyy;
DateField.setText(dd+"/"+mm+"/"+yyyy);