为什么ActiveRecord SQL和PL / SQL Developer SQL之间存在差异?

时间:2009-05-06 22:30:40

标签: sql oracle activerecord

我在Oracle PL / SQL Developer中有一个select语句,它根据日期检索值:

select * from <table> where to_date(create_date) = to_date('20090506', 'YYYYMMDD')

其中create_date是Oracle类型的日期。这将返回一个非空的集合。但是,在ActiveRecord中:

<Table>.find_by_sql("select * from <table> where to_date(create_date) = to_date('20090506', 'YYYYMMDD')")

不返回任何行,这是不正确的。我怀疑它与ActiveRecord如何处理Time / Date / DateTime对象有关。

有什么想法吗? 感谢

2 个答案:

答案 0 :(得分:2)

鉴于你自己的'hack'和列名create-DATE,我怀疑create-date是DATE列。当你执行日期列的to_date时,Oracle“友好”不足以引发错误,但如果它确实引发错误会更好。 所以正确的解决方案是(在ORACLE!中,就像在ActiveRecord中一样):

select * from <table> where create_date = to_date('20090506', 'YYYYMMDD')

简而言之:不要在日期列上使用to_date()。

答案 1 :(得分:0)

这是我的黑客。我并不以此为荣,但它会起作用。在我看来,实际上坚持使用Ruby / Oracle Date类型的任何更好的答案都会更好。

Table.find_by_sql("
  select * from <table>
  where to_char(create_date, 'YYYY-MM-DD') = '2009-05-06'
")