Сравнение даты в Улье

Я работаю с Ульем, и мне структурировали стол следующим образом:

CREATE TABLE t1 (
  id INT,
  created TIMESTAMP,
  some_value BIGINT
);

Я должен счесть каждый ряд в t1 , который меньше чем 180 дней. Следующий вопрос не приводит ни к каким рядам даже при том, что есть данные, существующие в столе, который соответствует предикату поиска.

select * 
from t1 
where created > date_sub(from_unixtime(unix_timestamp()), 180);

Что соответствующий путь состоит в том, чтобы выполнить сравнение даты в Улье?

6

5 ответы

Как насчет:

where unix_timestamp() - created < 180 * 24 * 60 * 60

Математика даты является обычно самой простой, если можно просто сделать это с фактическими ценностями метки времени.

Или вы хотите, чтобы он только убежал в целые дни? Тогда я думаю, что проблема с тем, как вы преобразовываете назад и вперед между ints и последовательностями. Попробуйте:

where created > unix_timestamp(date_sub(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),180),'yyyy-MM-dd')

Ходьба через каждый UDF:

  1. unix_timestamp() returns an int: current time in seconds since epoch
  2. from_unixtime(,'yyyy-MM-dd') converts to a string of the given format, e.g. '2012-12-28'
  3. date_sub(,180) subtracts 180 days from that string, and returns a new string in the same format.
  4. unix_timestamp(,'yyyy-MM-dd') converts that string back to an int

Если это все становится слишком волосатым, можно всегда писать UDF, чтобы сделать это сами.

11
добавлено
Фантастическое объяснение решения я закончил тем, что использовал. Один вопрос - будет сравнение между МЕТКА ВРЕМЕНИ / ПОСЛЕДОВАТЕЛЬНОСТЬ и , INT удается в этом случае?
добавлено автор Jeremiah Peschka, источник
Развитие - МЕТКА ВРЕМЕНИ / ПОСЛЕДОВАТЕЛЬНОСТЬ , чтобы INT сравнивает работы. Спасибо за ту информацию это упрощает вопрос приятно.
добавлено автор Jeremiah Peschka, источник

Альтернативно можно также использовать datediff . Тогда, где пункт был бы
в случае метки времени Последовательности (jdbc формат):

datediff(from_unixtime(unix_timestamp()), created) < 180;

в случае времени эпохи Unix:

datediff(from_unixtime(unix_timestamp()), from_unixtime(created)) < 180;
3
добавлено

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

yyyy-MM-dd HH:mm:ss

формат, тогда запрос Select работал на меня.

Согласно документации, Улей должен быть в состоянии преобразовать BIGINT представление секунд эпохи к метке времени, и что вся существующая дата и время UDFs работает с типом данных timestamp.

с этим простым запросом:

выберите from_unixtime (unix_timestamp ()), бросьте (unix_timestamp() как метка времени) от test_tt ограничивают 1;

Я ожидал бы, что обе области будут тем же самым, но я добираюсь:

2012-12-29 0:47:43 1970-01-16 16:52:22.063

Я вижу другую странность также.

2
добавлено
Похоже, что в этом сообщают УЛЕЙ 3454, но там hasn' t любая работа, сделанная, чтобы зафиксировать его, поскольку, автогрейдеры Улья хотят гарантировать назад совместимость со сломанным поведением.
добавлено автор Jeremiah Peschka, источник
Спасибо @JeremiahPeschka, плюс имеет работу... Я должен искать свои другие проблемы метки времени там также.
добавлено автор libjack, источник

TIMESTAMP is milliseconds
unix_timestamp is in seconds
You need to multiply the RHS by 1000.

where created > 1000 * date_sub(from_unixtime(unix_timestamp()), 180);
2
добавлено

После рассмотрения этого и обращения к Различие в дате меньше чем 15 минут в Улье Я предложил решение. В то время как я не уверен, почему Улей не выполняет сравнение эффективно в даты как последовательности (они должны сортировать и выдержать сравнение лексикографически), следующие работы решения:

FROM (
    SELECT  id, value,
            unix_timestamp(created) c_ts, 
            unix_timestamp(date_sub(from_unixtime(unix_timestamp()), 180), 'yyyy-MM-dd') c180_ts
    FROM    t1
) x
JOIN t1 t ON x.id = t.id
SELECT  to_date(t.Created), 
        x.id, AVG(COALESCE(x.HighestPrice, 0)), AVG(COALESCE(x.LowestPrice, 0))
WHERE   unix_timestamp(t.Created) > x.c180_ts
GROUP BY to_date(t.Created), x.id ;
1
добавлено