ORA-00936 在 oracle 选择语句中使用日期函数时

Posted

技术标签:

【中文标题】ORA-00936 在 oracle 选择语句中使用日期函数时【英文标题】:ORA-00936 When using date function in the oracle select statement 【发布时间】:2013-10-02 17:45:18 【问题描述】:

我有一个查询,我试图根据 Oracle 中两个 unix 时间戳之间的小时数聚合数据。最困难的部分是即使我在查询中没有看到任何错误,我也会因“ORA-00936: missing expression”错误而出错。在这里需要一些专家建议。以下是查询-

查询 -

select DATE(FROM_UNIXTIME(C.DATETIMEORIGINATION)) the_date,
HOUR(FROM_UNIXTIME(C.DATETIMEORIGINATION)) the_hour,
count(c.RECORD_ID) the_count 
FROM TABLE_A C 
WHERE C.DATETIMEORIGINATION between 1380033019 AND 1379702408 
GROUP BY 1,2;

非常感谢任何帮助。谢谢

【问题讨论】:

DATE()HOUR()FROM_UNIXTIME() 不是 built-in Oracle functions。您不能总是直接使用来自另一个 RDBMS 的代码。虽然我猜你可以自己创建它们作为函数。您想要什么输出 - 这将确定最合适的等价物?您也不能在group by clause 中使用位置符号。 这很有趣。我检查了 Oracle 站点 (docs.oracle.com/cd/E17952_01/refman-5.1-en/…),它具有正在使用的功能及其实现。不知道这里是否遗漏了什么。 这是 mysql 文档,不是 Oracle 数据库。除了一些参考资料(主要是在命令提示符中)之外,这在该页面上并不完全明显。页面底部的home link 使它更清晰一些。您不是第一个因都在 docs.oracle.com 下而感到困惑的人... 好的.. 你让我脱裤子了。 :P 我正在尝试根据两个 unix 时间戳之间的小时数来计算记录。感谢您的帮助。! 【参考方案1】:

如果您希望 the_date 字段作为实际日期:

select trunc(date '1970-01-01' + datetimeorigination / (24*60*60)) as the_date,
  to_char(date '1970-01-01' + datetimeorigination / (24*60*60),
    'HH24') as the_hour,
  count(record_id)
from table_a
group by trunc(date '1970-01-01' + datetimeorigination / (24*60*60)),
  to_char(date '1970-01-01' + datetimeorigination / (24*60*60), 'HH24');

THE_DATE  THE_HOUR COUNT(RECORD_ID)
--------- -------- ----------------
24-SEP-13 14                      1 
20-SEP-13 18                      1 

如果您希望小时值作为数字,您可以将该字段包装在 to_number() 调用中。如果这是为了显示,那么您也应该明确格式化日期:

select to_char(date '1970-01-01' + datetimeorigination / (24*60*60),
    'YYYY-MM-DD') as the_date,
  to_char(date '1970-01-01' + datetimeorigination / (24*60*60),
    'HH24') as the_hour,
  count(record_id)
from table_a
group by to_char(date '1970-01-01' + datetimeorigination / (24*60*60),
    'YYYY-MM-DD'),
  to_char(date '1970-01-01' + datetimeorigination / (24*60*60), 'HH24');

THE_DATE   THE_HOUR COUNT(RECORD_ID)
---------- -------- ----------------
2013-09-24 14                      1 
2013-09-20 18                      1 

或者将日期和时间放在一个字段中:

select to_char(date '1970-01-01' + datetimeorigination / (24*60*60),
    'YYYY-MM-DD HH24') as the_hour,
  count(record_id)
from table_a
group by to_char(date '1970-01-01' + datetimeorigination / (24*60*60),
    'YYYY-MM-DD HH24');

THE_HOUR      COUNT(RECORD_ID)
------------- ----------------
2013-09-24 14                1 
2013-09-20 18                1 

取决于你想看什么以及你打算用它做什么。

无论您使用哪个字段进行聚合,都需要在 group by 子句中以相同的方式指定它们 - 您不能使用位置表示法,例如group by 1, 2。而且您已经意识到between 值必须按升序排列,否则根本找不到任何东西。

【讨论】:

优秀。效果很好,这是我所期待的。非常感谢你,你拯救了我的一天@Alex Poole。非常感谢您的帮助。

以上是关于ORA-00936 在 oracle 选择语句中使用日期函数时的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 数据库中执行SQL语句 出现 [Err] ORA-00936: 缺失表达式! 但在SQL server 中可以使用 大家帮帮忙

ORA-00936: 缺少表达式 oracle

Oracle CASE WHEN - ORA-00936:缺少表达式

ORA-00936: 缺少表达式解决方案 - 转换函数

ORA-06550:第 12 行,第 9 列:PL/SQL:ORA-00936:缺少表达式 ORA-06550:第 9 行,第 5 列:PL/SQL:忽略 SQL 语句

ORA 00936 缺少表达式