使用两列的SQL日期范围

时间:2019-01-22 10:18:45

标签: sql hive

我在Hive表中有两列,分别是dthr,我想在两个给定的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

3 个答案:

答案 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))

稍后,您可以从此新添加的列中选择日期时间范围。

如果您不想在表中添加任何新列,请将表中的值插入到临时表中,并在该临时表中加入日期时间。