将日期发送到 postgresql

Sending dates into postgresql

我对这个有一些疑问,我已经阅读了其他主题,但我仍然无法使代码正常工作。

我的意图是使用 JDBC 将日期插入到我的数据库中,我使用的是 jTextField(或 JformattedField,尝试两种方式),但我得到的只是来自数据库的错误。因为我发送的是文本而不是日期,所以,我该如何发送日期?

EDIT1:我正在尝试发送出生日期。

已经做了一些尝试,这就是为什么我有:

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

代码:

try {   
        conecta.conn.setAutoCommit(false);
        PreparedStatement pst = conecta.conn.prepareStatement("INSERT INTO cad_pessoa(cad_cpf,cad_nome, cad_idade, cad_apelido, cad_data) values (?,?,?,?,?)");

        
        pst.setString(1, jFormattedTextFieldCPF.getText()); //pega o texto insirido e armazena no banco de dados
        pst.setString(2, jTextFieldNOME.getText()); //pega o texto insirido e armazena no banco de dados
        pst.setString(3, jTextFieldIDADE.getText()); //pega o texto insirido e armazena no banco de dados
        pst.setString(4, jTextFieldApelido.getText());//pega o texto insirido e armazena no banco de dados
        SimpleDateFormat formatter  = new SimpleDateFormat ("dd/MM/yyyy");
        java.sql.Date data = new java.sql.Date(formatter.parse().getTime());
        pst.setDate(5, formatter.parse(jFormattedTextFieldDATA.getText())); //pega o texto insirido e armazena no banco de dados
        pst.executeUpdate(); //executa o SQL
        
        
        conecta.conn.commit();
        
        
        jFormattedTextFieldCPF.setText(""); //deixa o campo vazio
        jTextFieldNOME.setText(""); //deixa o campo vazio
        jTextFieldIDADE.setText(""); //deixa o campo vazio
        jFormattedTextFieldDATA.setText("");
        jTextFieldApelido.setText(""); //deixa o campo vazio
        
        jFormattedTextFieldCPF.setEnabled(false);
        jTextFieldNOME.setEnabled(false);
        jTextFieldIDADE.setEnabled(false);
        jFormattedTextFieldDATA.setEnabled(false);
        jTextFieldApelido.setEnabled(false);
        JOptionPane.showMessageDialog(null, "Salvo!");
        
        
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(rootPane, "Erro!\n" +ex);

    }

您使用的 setInt() 方法适用于整数值,它接受整数。要设置日期,请使用 PreparedStatement.setDate() 方法。

你从parse()方法得到的java.util.Date也应该转换为java.sql.Date

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date utilDate = formatter.parse(jFormattedTextFieldDATA.getText());
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
pst.setDate(5, sqlDate);

请参阅 PreparedStatement class 上的文档:https://docs.oracle.com/javase/9/docs/api/java/sql/PreparedStatement.html

pst.setInt(5, formatter.parse(jFormattedTextFieldDATA.getText()));

这是罪魁祸首。看到您正在使用 setInt() 方法来设置日期。那是绝对不正确的。请改用 setDate() 方法。

例如:pst.setDate(5, formatter.parse(jFormattedTextFieldDATA.getText()));

避免遗留日期时间 类

切勿使用 java.until.Datejava.sql.DateSimpleDateFormat 等。这些遗留日期时间 类 很糟糕 ,在设计上存在可悲的缺陷。

遗留 类 多年前被 JSR 310 中定义的现代 java.time 类 所取代。

java.time.LocalDate

将您的输入字符串解析为 LocalDate

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ; 
LocalDate ld = LocalDate.parse ( input , f ) ;

通过准备好的语句传递到您的数据库。

myPreparedStatement.setObject( … , ld ) ;

从数据库中检索:

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

在 Postgres 中,您可以将列定义为 DATE.

类型

使用 JDBC driver compliant with version 4.2 or later of the JDBC specification.

所有这些都已在 Stack Overflow 上多次提及。搜索以了解更多信息。