Oracle Where First 和 Last Day 返回 ORA-00904:“NOV”:标识符无效

Posted

技术标签:

【中文标题】Oracle Where First 和 Last Day 返回 ORA-00904:“NOV”:标识符无效【英文标题】:Oracle Where First and Last Day returned ORA-00904: "NOV": invalid identifier 【发布时间】:2017-11-26 00:17:46 【问题描述】:

我是 Oracle 的新手,我想要统计本月第一天和最后一天的数据(动态)。

我的 php 代码如下所示:

$date = Date('d-M-y');

// Query
$query = "Select COUNT(*) FROM myTable WHERE CREATED 
          BETWEEN FIRST_DAY(TRUNC(TO_DATE(".$date."), 'MON')) AND 
                  LAST_DAY(TRUNC(TO_DATE(".$date."), 'MON'))";

但我总是得到错误

ORA-00904:“NOV”:标识符无效

哪个NOV 是正确的月份-对吗?

【问题讨论】:

@user10089632 不,这对我没有帮助:( 在这两个地方都试试这个to_date(' " . $date . " ', 'DD-MON-YY') 怎么样?? 使用bind parameters - 另见this answer 【参考方案1】:

如果你把它留给oracle,你可以使用

$query = "Select COUNT(*) FROM myTable WHERE TRUNC(SYSDATE,'MON') = TRUNC(CREATED,'MON')";

如果您在 CREATED 上有一个索引,使用起来可能会更快

$query = "Select COUNT(*) FROM myTable WHERE CREATED >=  TRUNC(SYSDATE,'MON') AND CREATED < TRUNC(ADD_MONTH(SYSDATE,1),'MON')

【讨论】:

好吧,我对第一个声明投了赞成票,但在第二个 TRUNC(ADD_MONTHS(SYSDATE,1),'MON') 中产生 '20171201'(格式为 yyyymmdd ),并且应该被排除在范围之外。跨度> @Barbaros Özhan,对,但仅包括 20171201 00:00:00.000。如果这是应用程序的实际日期(或未保存时间部分),则必须额外排除。 将 bwtween 替换为 >= 和 好的,好的,谢谢。顺便说一句,从性能的角度考虑是非常好的。【参考方案2】:

感谢您尝试回答,但我得到了这个来解决我的问题:

获取我使用的月份的第一天:

"TRUNC(TO_DATE('".$date."', 'DD-MM-YY'), 'MM')"

最后一天,使用:

"LAST_DAY(TO_DATE('".$date."', 'DD-MM-YY'))"

【讨论】:

以上是关于Oracle Where First 和 Last Day 返回 ORA-00904:“NOV”:标识符无效的主要内容,如果未能解决你的问题,请参考以下文章

Oracle分析函数-first_value()和last_value()

oracle first_value,last_valus

Oracle分析函数-first_value()和last_value()

Oracle分析函数-first_value()和last_value()

Oracle 排序中使用nulls first 或者nulls last 语法

Laravel / Eloquent WHERE NOT SUBQUERY