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_value()
Oracle分析函数-first_value()和last_value()