Отформатируйте int как дату в preto SQL - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть целочисленный столбец даты «date_created», в котором хранятся такие значения, как ...

20180527, 20191205, 20200208

И мне интересно, каков наилучший способ анализа даты, чтобы я мог сделать что-то подобное в запросе...

select * from table where formatted(date_created) > formatted(date_created) - 90

(чтобы вернуть все за последние 90 дней)

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

Цените любые мысли о том, как лучше всего достичь этого

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

Вы можете сделать сравнение в мире целых чисел или дат.Вы также можете преобразовать текущую дату минус 90 дней в число:

select t.*
from t
where date_created >= cast(date_format(current_date - interval '90 day',
                                       '%Y%m%d'
                                      ) as int
                          );
0 голосов
/ 22 декабря 2018

И мне интересно, как лучше всего проанализировать дату, чтобы я мог сделать что-то подобное в запросе ...

Вы можете преобразовать «дату как число»(например, 20180527 для 27 мая 2018 г.) с использованием следующего:

  1. приведение к varchar
  2. parse_datetime с соответствующим форматом
  3. приведение к дате (поскольку parse_datetime возвращает timestamp)

Пример:

presto> SELECT CAST(parse_datetime(CAST(20180527 AS varchar), 'YYYYMMDD') AS date);
   _col0
------------
 2018-01-27

Однако , это не обязательно лучший способ запроса ваших данных.Адаптируя условия поиска к формату ваших данных (а не наоборот), вы потенциально можете извлечь выгоду из предикатного нажатия и сокращения раздела.Посмотрите ответ @GordonLinoff для информации, как это сделать.

0 голосов
/ 22 декабря 2018

следующий запрос является дружественным к индексу для любой базы данных, поскольку он не использует функцию для индексированного столбца

select * from table where date_created > timestamp (formatted(date) - 90)
...