我在Hive表中有两列,分别是dt
和hr
,我想在两个给定的dt和hr值之间获取dt和hr
例如:dt ='2019-01-10'和'2019-01-15',因此我想获取dt范围,因此我将像select * from table_name where dt >='2019-01-10' and dt<='2019-01-15';
一样查询如何在另外一列中实现相同的效果hr
如下:
select * from table_name where (dt >='2019-01-10' and hr >='05') and (dt<='2019-
01-15' and hr <='15')
;
但是上述查询无法按预期方式工作,因此对于所有日期都返回hr> ='05',但是我希望在2019-01-10至2019-01之间的日期都使用hr(00至23) -15
答案 0 :(得分:1)
您必须检查由or
组合而成的3个条件。
如果dt
为'2019-01-10'
,则hr
必须为>= '05'
。
如果dt
为'2019-01-15'
,则hr
必须为<= '15'
。
对于dt
(不包括)和'2019-01-10'
(不包括)之间的任何其他'2019-01-15'
不应检查hr
的值。
select *
from table_name
where
(dt ='2019-01-10' and hr >= '05')
or
(dt ='2019-01-15' and hr <= '15')
or
(dt > '2019-01-10' and dt < '2019-01-15')
替代解决方案:
select *
from table_name
where
concat(dt, ' ', hr) >= concat('2019-01-10', ' ', '05')
and
concat(dt, ' ', hr) <= concat('2019-01-15', ' ', '15')
如果您可以使用between
,那就更好了:
select *
from table_name
where
concat(dt, ' ', hr) between
concat('2019-01-10', ' ', '05') and concat('2019-01-15', ' ', '15')
答案 1 :(得分:0)
只需添加没有时间限制的那几天的条件:
select * from table_name
where ((dt >= '2019-01-10' and hr >= '05') and (dt <= '2019-01-15' and hr <='15'))
or (dt > '2019-01-10' and dt < '2019-01-15')
或者,Hive是否支持“行和表的构造函数”:
select * from table_name
where (dt, hr) >= ('2019-01-10', '05') and (dt, hr) <= ('2019-01-15', '15')
答案 2 :(得分:0)
为什么不添加新列并加入dt和hr
更新#tab设置datetime1 = CAST(CONCAT(date1,'',time1)AS DATETIME2(7))
稍后,您可以从此新添加的列中选择日期时间范围。
如果您不想在表中添加任何新列,请将表中的值插入到临时表中,并在该临时表中加入日期时间。