【问题标题】:How to store user input date and pass them in sql query如何存储用户输入日期并在 sql 查询中传递它们
【发布时间】:2021-09-18 14:08:30
【问题描述】:

为了让我们的代码更有用。 在这里我尝试了很多模式但没有得到我的结果

然而,我面临日期变量的问题,如果我传递静态变量,那么它是正确的输出。但我想动态(用户输入日期)。我不会通过预定义的日期。

请给我适当的解决方案。

代码如下:

        Connection con=DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:VASVMT","scott","tiger");


        Statement stmt=con.createStatement();
        
        Scanner sc=new Scanner(System.in);
        System.out.println("Enter DOB (dd-mm-yyyy) format");
        String td=sc.next();
        SimpleDateFormat date1=new SimpleDateFormat("dd-MM-yyyy");
        System.out.println(date1);
        java.util.Date tdd=date1.parse(td);
        System.out.println(tdd);
        long ms=tdd.getTime();
        System.out.println(ms);
        java.sql.Date dttt=new java.sql.Date(ms);
        System.out.println(dttt);
         
        
        String sql="select * from tbl_transaction_new where to_char(date_time,'dd-mm-yyyy')='dttt'";
        ResultSet rs = stmt.executeQuery(sql);
        while(rs.next()) {
              
               System.out.print(" NAME: "+rs.getString("messgae"));
            
        
               System.out.print(" Date: "+rs.getDate("date_time"));
             
               System.out.println();
    
        
    con.close();
    }

我的sql表——点赞

message(column) 和 date_time(column, datatype- Date).. 在 date_time 列中的值类似于 05-JUL-2021 、 08-JUL-2021 、 01-JAN-2021。

【问题讨论】:

  • 我建议你不要使用SimpleDateFormatDate。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APILocalDateDateTimeFormatter。见Insert & fetch java.time.LocalDate objects to/from an SQL database such as H2
  • 您的代码似乎在处理用户输入td。你错过了什么?
  • 朋友,在您发布问题后的最初几个小时内密切关注您的问题并立即对其进行编辑以响应任何澄清请求是个好主意。此时兴趣最大,因此它增加了您获得良好接收和良好答案的机会。

标签: java sql date datetime


【解决方案1】:
  1. 使用现代 Java 日期和时间 API java.time 进行日期工作。
  2. 不要在日期对象、字符串和长整数之间来回转换。将您的用户输入字符串 once 解析为 LocalDate,其余部分使用 LocalDate。此外,您不需要在 SQL 中使用 to_char
  3. 在您的 SQL 中使用 ? 参数占位符并替换 Java 中的实际参数。
  4. con.close(); 移出循环,否则您可能只能读取第一行。

在代码中:

    String userInput = "06-09-1987"; // = sc.next();
    LocalDate dob = LocalDate.parse(userInput, DTF);
    
    String sql = "select * from tbl_transaction_new where date_time = ?;";
    PreparedStatement stmt = con.prepareStatement(sql);
    stmt.setObject(1, dob);
    ResultSet rs = stmt.executeQuery();
    while(rs.next()) {
        System.out.print(" NAME: " + rs.getString("messgae"));
        System.out.print(" Date: " + rs.getObject("date_time", LocalDate.class));
        System.out.println();
    }
    con.close();

代码使用以下日期格式化程序:

private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern("dd-MM-uuuu");

我还没有安装 Oracle,所以没有机会测试自己。我已经编译了代码。如果编译中没有发现错别字,请见谅。

注意我是如何从结果集中检索LocalDate 而不是老式的java.sql.Date。将 LocalDate 或其他 java.time 类型传入和传出 SQL 需要 JDBC 4.2。现在我们几乎所有人都有这种情况。

编辑:你进一步问:

我的表数据有问题.. 如果列 (date_time) 值类似于 201 年 7 月 5 日(类型 - 日期)。在这种情况下,我们需要使用 to_char 变量与否(?)

05-JUL-2021 是 Oracle 显示日期以响应查询的方式。它与日期在数据库中的内部存储方式无关。您和数据库都可以更轻松地比较两个日期,而无需先将它们转换为 char。所以不,不要使用to_char(再次表示未经测试)。

链接

Oracle tutorial: Date Time 解释如何使用 java.time。

【讨论】:

  • 首先谢谢,我的表数据有问题。如果列 (date_time) 的值类似于 05-JUL-201 (Type - Date)。在这种情况下,我们是否需要使用 to_char 变量。
  • @AMITPATEL 感谢您的后续问题。请查看我的编辑。
  • @AMITPATEL 我很想知道答案是否有帮助,还有什么我可以贡献的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
相关资源
最近更新 更多