首页 > 解决方案 > 转换为 dd-MMM-yy 格式的 java.sql.Date

问题描述

我正在做 jdbc 并使用日期参数调用一个过程,但我的数据库表日期格式是 dd-MMM-yy 格式,因此我将字符串日期转换为 dd-MMM-yy 格式,但我无法 setDate(1,sdt) cuz sdt 必须是 java.sql.Date 类型并且 java.sql.Date 格式是 yyyy-MM-dd 因此我需要帮助

我的程序是这样定义的:

PROCEDURE pStoreData(d_sumDttm IN DATE, i_Retval out number);

短代码:

    System.out.print("Enter report date:");
    String sdate = scanner.nextLine();
    final Date date = new Date();
    final SimpleDateFormat format = new SimpleDateFormat();
    format.applyPattern(dd-MMM-yy);
    final String sysdt = format.format(date);
    java.sql.Date sqldt = java.sql.Date.valueOf(sysdt);
    callablestate = connection.prepareCall("{call Report.pStoreDate(?,?)}");
    callablestate.setDate(1,sqldt);
    callablestate.registerOutParameter(2,Types.REF_CURSOR);
    callable.execute();

标签: javadatestored-proceduresjdbcdate-formatting

解决方案


更新

发布此更新,因为 OP 似乎在努力解决如何使用原始解决方案。

亲爱的欧普,

Java 仅以一种方式实例化日期/时间/日期时间,然后您可以以自定义方式对其进行格式化。数据库的工作方式相同。因此,您向用户显示的格式或用户输入日期的格式都没有关系;一旦您通过应用相应的格式将其解析为日期/时间/日期时间对象,您只需将其传递给 Java/DB,Java/DB 将负责其余的工作。

import java.time.LocalDate;
import java.util.Scanner;

import com.mysql.jdbc.CallableStatement;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter report date in MM-dd-yyyy format: ");
        String strDate = scanner.nextLine();
        LocalDate localDate = LocalDate.parse(strDate, DateTimeFormatter.ofPattern("MM-dd-yyyy"));
        CallableStatement st = conn.prepareCall("{call Report.pStoreDate(?,?)}");
        st.setObject(1, localDate);
        st.registerOutParameter(2, Types.REF_CURSOR);
        st.execute();
    }
}

原答案:

我建议你不要使用过时且容易出错的java.util.Date. 改为使用LocalDate如下所示:

LocalDate localDate = LocalDate.now();
PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1, localDate);
st.executeUpdate();

推荐阅读