【问题标题】:Convertion to java.sql.Date for dd-MMM-yy format转换为 dd-MM-yyyy 格式的 java.sql.Date
【发布时间】:2020-11-29 11:17:12
【问题描述】:

我正在做 jdbc 并使用日期参数调用一个过程,但我的数据库表日期格式是 dd-MMM-yy 格式,因此我将我的字符串日期转换为 dd-MMM-yy 格式,但我无法 setDate(1, sdt) 因为 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();

【问题讨论】:

  • 如果您使用java.sql.Date 插入,则数据库的日期格式无关紧要,因此请忘记所有有关日期格式的内容并插入日期值。仅当您将日期值插入为 String 时,日期格式才重要,我强烈建议您不要这样做。
  • @Arhana 你有没有看过非常好的答案,表明你需要打电话给setObject() 以获得LocalDate,而不是setDate()?
  • 你试过什么?您没有在问题中添加任何代码来显示您尝试过的内容。但是,让我猜猜,你调用LocalDate.parse("10-08-20") 甚至该方法的文档 明确表示格式必须是"2020-10-08",所以它当然会失败。为什么你会期待其他情况?
  • 你快到了。 callablestatement.setObject(1,ld) 应该这样做(除非有一些相关的事情你没有告诉我们)。

标签: java date stored-procedures jdbc date-formatting


【解决方案1】:

更新

发布此更新,因为 OP 似乎正在为如何使用原始解决方案而苦苦挣扎。

亲爱的 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();

【讨论】:

  • 在尝试了您的解决方案后,我得到了 java.sql.Exception : Invalid column type
  • 这个答案有正确的想法,但似乎错过了一个事实,即 OP 使用的是CallableStatement,而不是PreparedStatement(只有在这个答案发布很久之后,cmets 才变得清晰)。
  • @Arhana 如果您编辑您的问题并向我们提供您的过程定义以及参数的数据类型以及 Java您尝试应用此答案中的解决方案的代码。
  • @Ole V.V, PROCEDURE pStoreData(d_sumDttm IN DATE, i_Retval out number);短代码:System.out.print("请输入报告日期:");字符串 sdate =scanner.nextLine();最终日期 date = new Date();最终的 SimpleDateFormat 格式 = 新的 SimpleDateFormat();格式.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();
  • 异常是:java.sql.SQLException:无效的列类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 2011-11-07
  • 2017-06-24
  • 2016-04-10
  • 1970-01-01
  • 2016-06-21
相关资源
最近更新 更多