У меня есть два столбца в таблице 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';, как добиться того же с еще одним столбцом {{X1 }} что-то вроде ниже:

select * from table_name where (dt >='2019-01-10' and hr >='05') and (dt<='2019- 01-15' and hr <='15');

Но приведенный выше запрос не работает должным образом, который возвращает hr> = '05' для всех дат. Но я хочу, чтобы все часы (от 00 до 23) для дат между 2019-01-10 и 2019-01-15

-1
Vicky 22 Янв 2019 в 13:18

3 ответа

Лучший ответ

Вы должны проверить 3 условия, объединенные or.
Если 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
forpas 22 Янв 2019 в 11:23

Почему бы вам не добавить новый столбец и присоединиться к тт и ч

Update #tab set datetime1 = CAST (CONCAT (date1, '', time1) AS DATETIME2 (7))

Позже вы можете выбрать диапазон даты и времени из этого недавно добавленного столбца.

Если вы не хотите добавлять какой-либо новый столбец в вашу таблицу, вставьте значения в вашей таблице во временную таблицу и присоедините время даты к этой временной таблице.

0
Krishna508 22 Янв 2019 в 10:41

Просто добавьте условие для тех дней без ограничений по часам:

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')
0
jarlh 22 Янв 2019 в 13:11