使用 setDate 的查询找不到结果 - 看不到带参数的最终查询

Query using setDate does not find results - cannot see final-query with parameters

我有一个 SQL,它查看维度 table(存储直到 2020 年的每个日期),然后检索今天的行。 我看了 table,里面有今天的日期。 问题是,SQL 没有 return 任何结果。

我在想一个与java.sql.PreparedStatement.setDate方法的使用有关的问题。 过去我认为这工作正常,现在我做了一些回归测试但失败了。与过去的不同之处在于现在使用 Oracle 12 DB 而不是过去的 11,并且 运行 它在 CentOS 6.5 而不是 AIX 上。

通过搜索,我在这里找到了这个主题: Using setDate in PreparedStatement

据我所知,我正在按照建议做。

这是 java 代码和查询:

public static String SELECT_DATUM = "SELECT TIME_ID, DATE, DAY_NAME, WEEK_NAME, MONTH_NAME, YEAR_NAME, SORTING, RELATIONDATE, VALID_TO, VALID_FROM FROM DIM_TIME WHERE DATE = :date";

java.util.Calendar now = Calendar.getInstance();
now.clear(Calendar.HOUR);
now.clear(Calendar.MINUTE);
now.clear(Calendar.SECOND);
now.clear(Calendar.MILLISECOND);

Date tmpDate = now.getTime();

Date tmpDate2 = new Date(((java.util.Date)tmpDate ).getTime());

statement.setDate(1, tmpDate2 );

我注意到 getTime() 被调用了两次。但我不认为它那么糟糕。 我还注意到一些显示格式: 在数据库中,日期列向我显示这样的日期:'08.11.2015' 在 java 中调试 tmpDate2 时向我显示这样的日期:'2015-11-08' 在 java 调试 tmpDate 时显示了这样的日期 'Sun Nov 08 12:00:00 CET 2015'

但是,这些只是显示格式,而它是后台的日期对象和数据库中的日期类型。我希望 je JDBC 驱动程序会在没有格式的情况下自行映射它,这就是我们使用 setDate 方法而不是 setString 的原因。

我做错了什么?我可以做些什么来进一步调试以获得它? 我希望看到最终使用参数执行的结果 SQL 查询。

我在数据库实例上试过 sql:

SELECT * FROM v$sql s WHERE s.sql_text LIKE '%select time%' ;

但那时才得到这个:“... where date = trunc(:1 )” 至少在这一行我可以看到它使用了我期望它使用的正确模式以及我在哪里检查今天的日期是否可用。

编辑: 我发现的东西: 我看到另一个代码使用相同的函数,但给出的是 GregorianCalendar 而不是 Calendar。使用时 新公历日历(); 代替 Calendar.getInstance(); 没有区别。 但是当我指定一个日期并且不让系统使用当前时间时,它就可以工作了: 使用 新公历 (2015, Calendar.NOVEMBER, 8); 将从 SQL.

检索我想要的行

Zsigmond Lőrinczy 将此答案发布为评论:

Try this: SELECT TIME_ID, DATE, DAY_NAME, WEEK_NAME, MONTH_NAME, YEAR_NAME, SORTING, RELATIONDATE, VALID_TO, VALID_FROM FROM DIM_TIME WHERE DATE = TRUNC (:date) – 3 hours ago

这对我的问题有效。

如果他不打算写自己的回复(以获得声誉点),我正在写这个作为回复,稍后检查它作为这个问题的答案。

但我想知道如何通过准备 java 获得相同的结果。 代码使用 clear-methods,它被释放到一个名为 'trunc' 的自己的方法中。我认为程序员打算这样做而不是 SQL 中的 TRUNC。我想知道在 java 中是否不可能这样做,如果可以,怎么做?

编辑: 我想知道为什么根本需要 TRUNC。因为数据库中的列是日期类型而不是时间戳。那么不会有自动截断吗?我希望如此。为什么我需要在 SQL 上截断?