我有一个查询,我正在尝试根据Oracle中两个unix时间戳之间的小时数来聚合数据。最难的部分是,我在“ ORA-00936:缺少表达式”错误时出错,即使我在查询中没有看到任何错误。这里需要一些专家建议。以下是查询 -
查询 -
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;
非常感谢任何帮助。感谢
答案 0 :(得分:2)
如果您希望将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
值必须按升序排列,否则根本找不到任何内容。