2017-05-15 70 views
0

我会尽可能地解释我的问题。我想,以滤除日期表(只选择记录都包含在当月日期)和甲骨文的SQL我使用下面的查询来实现这样的目标:如何在日期列的Hive SQL中执行BETWEEN运算符

select * from table t1 
where t1.DATE_COLUMN between TRUNC(SYSDATE, 'mm') and SYSDATE 

我怎样才能在Hive SQL中复制相同的过滤器?我应该用来应用过滤器的列是TIMESTAMP类型列(例如2017-05-15 00:00:00)。

我正在使用CDH 5.7.6-1。

有什么建议吗?

+0

是'DATE_COLUMN'分区列? –

+0

@DuduMarkovitz不,它不是分区列。 – MarioC

回答

0

请注意,unix_timestamp未修复,并且在查询过程中将发生变化。
因此,它不能用于分区消除。
对于较新的Hive版本,请改为使用current_date/current_timestamp

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

select * 
from table t1 
where t1.DATE_COLUMN 
      between cast(from_unixtime(unix_timestamp(),'yyyy-MM-01 00:00:00') as timestamp) 
      and  cast(from_unixtime(unix_timestamp()) as timestamp) 
; 

select cast (from_unixtime(unix_timestamp(),'yyyy-MM-01 00:00:00') as timestamp) 
     ,cast (from_unixtime(unix_timestamp()) as timestamp) 
; 

+---------------------+---------------------+ 
|   _c0   |   _c1   | 
+---------------------+---------------------+ 
| 2017-05-01 00:00:00 | 2017-05-16 01:04:55 | 
+---------------------+---------------------+ 
+0

查看更新的答案 –

-1

可以作为字符串格式化:

where date_format(t1.DATE_COLUMN, 'y-m') = date_format(current_timestamp, 'y-m') 

我意识到我没有蜂巢访问的现在。文档建议'y-m',但Java文档建议'yyyy-mm'

+0

我尝试了你的建议,但我得到一个语义异常错误“无效的函数date_format。 – MarioC