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

Posted

技术标签:

【中文标题】为啥 ActiveRecord SQL 和 PL/SQL Developer SQL 之间存在差异?【英文标题】:Why is there a discrepancy between ActiveRecord SQL and PL/SQL Developer SQL?为什么 ActiveRecord SQL 和 PL/SQL Developer SQL 之间存在差异? 【发布时间】:2009-05-06 22:30:39 【问题描述】:

我在 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 对象有关。

有什么想法吗? 谢谢

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

嗯,这是我的 hack。我并不为此感到自豪,但它会起作用。在我看来,实际上坚持 Ruby/Oracle Date 类型的任何更好的答案都会更好。

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

【讨论】:

以上是关于为啥 ActiveRecord SQL 和 PL/SQL Developer SQL 之间存在差异?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PL/SQL 会失败

为啥带有 Mysql2 Gem ActiveRecord::Base.connection.execute(sql) 的 Rails 3 返回 Array 而不是 Hash?

pl/sql developer中文乱码,为啥呢?怎么解决?Oracle问题

pl/sql developer中文乱码,为啥呢?怎么解决?Oracle问题

pl/sql developer中文乱码,为啥呢?怎么解决?Oracle问题

为啥这个 PL/SQL 不起作用?