Запрос BigQuery к (пользовательской) секционированной таблице с метками времени возвращает нулевые результаты

#sql #google-bigquery

#sql #google-bigquery

Вопрос:

У меня есть таблица в наборе данных со следующей схемой:

 date TIMESTAMP
id INTEGER
...
  

Таблица секционируется по столбцу даты.

Предварительный просмотр таблицы в пользовательском интерфейсе BQ показывает, что в феврале в ней много строк:

 date, id, ...
2019-02-19 16:18:00 UTC, 534480012, ...
2019-02-19 16:23:00 UTC, 534423879, ...
  

Однако этот запрос возвращает нулевые результаты:

 SELECT id FROM `<project>.<dataset>.<table>`
WHERE 
  TIMESTAMP_SUB(date, INTERVAL 60*24 HOUR) <= `date` AND
  TIMESTAMP_SUB(date, INTERVAL 24 HOUR) >= `date`
  

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

Более того, даже запрос «по умолчанию» возвращает нулевые результаты:

 SELECT id FROM `<project>.<dataset>.<table>` WHERE date = TIMESTAMP("2019-02-19") LIMIT 1000
  

Ошибок нет ни в том, ни в другом случае. Просто пустые результаты. Что я делаю не так?

Ответ №1:

Как это вообще может быть правдой?

 TIMESTAMP_SUB(date, INTERVAL 24 HOUR) >= `date`
  

Если вычесть 24 часа, то это будет меньше, чем date , а не больше, чем date .

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

 WHERE DATE(date) = DATE('2019-02-19') 
  

Я настоятельно рекомендую вам изменить имя столбца. Называть столбец после ключевого слова SQL — плохая идея. Называть что-либо «датой», когда это действительно временная метка, вводит в заблуждение.