0

谈到 Oracle,我并不是一个特别出色的人,因为我在数据库方面的大部分经验都来自 SQL Server。

我有一个 java 日期,我试图在 oracle 中将其转换为一个简单的日期(不包括时间或时区),因此我可以将它与自定义 mybatis SQL 语句一起使用,该语句将简单地搜索日期是否为同一天作为用户界面上的输入。我的模拟 oracle 查询反映了 MyBatis 中发生的事情,下面写为我失败的 WHERE 子句。

我的日期以“2013 年 6 月 19 日星期三 00:00:00 BST 2013”​​的格式输入到 Oracle 中,不幸的是,我对这种格式没有太大的灵活性。

我失败的 WHERE 子句是这样的:

where TRUNC(s.logged_date) =  to_date('Wed Jun 19 00:00:00 BST 2013', 'DD-MON-YYYY');

它失败并出现错误:ORA-01858:在需要数字的地方发现了一个非数字字符。

我在表中的日期以 DATE 数据格式存储,我希望生成一个 WHERE 子句,这样

 WHERE TRUNC(s.logged_date) = some date in the year 

返回行。

使用 WHERE 子句,我正在寻找与时间无关的日期等效性。我在 s.logged_date 中的值的格式在 DATE 数据类型列中的 DD-MON-YYYY 中。

我真的希望你能帮我解决这个问题,因为我一直在使用我手头的任何书,并且在互联网上搜索了很长一段时间以尝试生成正确的工作 WHERE 子句。

谢谢

4

2 回答 2

2

你的问题在这里:

to_date('Wed Jun 19 00:00:00 BST 2013', 'DD-MON-YYYY')

字符串“Wed Jun 19 00:00:00 BST 2013”​​与格式掩码“DD-MON-YYYY”不匹配。您需要将字符串格式化为“19-JUN-2013”​​以匹配格式掩码,或者格式掩码应为“DAY MON DD HH24:MI:SS TZD YYYY”。但是,如果您选择更改格式掩码以匹配日期字符串,那么您将无法使用 to_date(),因为 to_date() 不支持时区。如果您想在日期/时间字符串中支持时区,则需要 to_timestamp_tz()。

有关日期/时间格式的更多信息,请参见此处: http ://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34924

希望有帮助....

于 2013-06-27T17:10:18.043 回答
2

我正在回答我自己的问题,因为我现在已经设法解决了。但不是通过使用所有不同的自定义函数,而是通过动态 SQL 更好地使用 MyBatis 函数。在我试图查找所有记录的那天,在我的 SQL 的 00:00:00 到 23:59:59 之间使用 MyBatis 中的“between”函数,效果更好并检索所有所需的记录,无需任何数据库特定功能。

感谢大家的帮助和建议。

于 2013-06-28T10:22:57.347 回答