2013-06-27 141 views
0

当谈到Oracle时,我并不是一个特别优秀的人,因为我对数据库的大部分经验都来自SQL服务器。用TRUNC和TO_DATE截断oracle中的java格式化日期()

我有一个java日期,我想转换为只是一个简单的日期(不包括时间或时区)在oracle中,所以我可以使用它与自定义mybatis SQL语句,将简单地搜索是否日期与用户界面上输入的日期相同。我的模拟oracle查询镜像MyBatis中发生的事情在下面写为我的失败WHERE子句。

我的日期以'Wed Jun 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子句。

感谢

+0

“表中的我的日期以DD-MON-YYYY格式存储” - 他们真的吗?如果是这样,*为什么*他们是这样存储的?你为什么不把它们存储在DATE字段中,这是一个日期,没有任何固有的格式?您需要区分真实数据以及它如何在SQL工具中进行格式化。 –

+0

除非它有时间元素,否则不需要“trunc”'logged_date'值;你可以用'to_char(logged_date,'DD-MON-YYYY HH24:MI:SS')'来检查。你的'to_date'很明显使用了一个与字符串值不相似的格式掩码,所以不会令人惊讶的失败;它试图将'我们'当作一天的数字,从DD'开始。你是否必须处理参数值中的不同时区? –

+0

@JonSkeet我对这一部分表示歉意。我想说的是,它是作为DATE数据类型存储的,数据在oracle中显示为格式DD-MON-YYYY(可能是默认值)。 我会为此编辑我的帖子。 –

回答

2

您的问题就在这里:

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

字符串 '周三06月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

希望帮助....

+0

您需要'to_timestamp_tz()',而不仅仅是'to_timestamp()'来使用'TZD'。 –

+0

谢谢亚历克斯。接得好。我相应地修改了我的答案。 –

+0

to_timestamp_tz()是否与DATE列一起使用以实现等价?它似乎是一个不同的数据类型,或者我可能是错的。 –

2

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

谢谢大家的帮助和建议。