Преобразование BigQuery в другой часовой пояс

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

Данные хранятся в GMT. Пользователь может пожелать увидеть данные в EST. В отчете может быть предложено сгруппировать данные по дате.

Я не вижу здесь функции преобразования часового пояса:

Кто-нибудь знает, как я могу это сделать в bigquery? т.е. как мне сгруппировать по после преобразования метки времени в другой часовой пояс?


person akshah123    schedule 18.09.2012    source источник


Ответы (7)


Обновление 2016 г.: Посмотрите ответы ниже, BigQuery теперь предоставляет методы временной метки и часового пояса.


Вы правы - BigQuery не предоставляет никаких методов преобразования меток времени.

В этом случае я предлагаю вам запустить GROUP BY на основе размеров поля метки времени GMT / UTC, а затем преобразовать и отобразить результат в местном часовом поясе в вашем коде.

person Michael Manoochehri    schedule 18.09.2012
comment
Привет, Майкл, спасибо за ответ. проблема в том, что, предположим, мне нужны данные, сгруппированные по дате. Теперь данные необходимо сгруппировать по дате в местном часовом поясе. то есть, если сегодня 1 час ночи по Гринвичу, на самом деле это вчера по EST. Мне пришлось бы сгруппировать данные по каждому значению временной метки и вернуть их. Однако для этого потребуется много операций ввода-вывода в сети и очень низкая производительность в общем отчете. Есть ли какие-нибудь хаки, которые я могу обойти? - person akshah123; 18.09.2012
comment
Почему бы не иметь столбец, в котором для каждой записи записывается местный часовой пояс пользователя? Затем вы можете быстро просмотреть полученные строки и указать правильную дату отображения. - person Michael Manoochehri; 18.09.2012
comment
мы рассматривали этот вариант, но проблема в том, что несколько пользователей могут запрашивать одни и те же данные. Таким образом, это непрактично, поэтому сохраняйте значение во всех возможных преобразованиях вместе с записью. Однако на данный момент у нас есть только пользователи в EST, поэтому мы можем выбрать этот маршрут. Это будет проблемой, если у нас будут пользователи за пределами региона. - person akshah123; 19.09.2012
comment
Кстати, где я могу предложить добавить эту функцию в большой запрос? - person akshah123; 19.09.2012
comment
Здесь все в порядке :-) ваш отзыв отмечен, мы работаем над улучшением поддержки DateTime. Обычно мы объявляем об обновлениях новых функций в этом списке рассылки, как только они будут готовы: groups .google.com / forum / #! forum / bigquery-announce - person Michael Manoochehri; 20.09.2012
comment
ОБНОВЛЕНИЕ: мы запустили новую общедоступную систему отслеживания проблем Google BigQuery, чтобы отображать запросы функций и отчеты об ошибках: code.google.com/p/google-bigquery - person Michael Manoochehri; 18.01.2013
comment
В BigQuery по-прежнему нет функций определения часового пояса? - person andrewm4894; 09.08.2016


С сентября 2016 года BigQuery принял стандартный SQL, и теперь вы можете просто использовать функцию «DATE (timestamp, timezone)» для смещения часового пояса. Вы можете ссылаться на их документы здесь:

документы BigQuery DATE

person milyord    schedule 19.10.2016
comment
Верно, что это новый функционал, но это не решает проблемы. Если у вас есть временная метка, вам обычно нужна новая временная метка. Эта функция принимает временную метку и выводит дату. - person Dennis Jaheruddin; 16.02.2017
comment
@DennisJaheruddin timestamp - это абсолютный момент времени (микросекунды из эпохи Unix для BigQuery). Нет новой отметки времени для получения. Если вы хотите, чтобы этот момент времени был представлен в определенном часовом поясе, вам необходимо преобразовать это абсолютное время в логическое календарное время, обычно представленное date. Именно это и делает эта функция. - person Mani Gandham; 10.04.2017
comment
@ManiGandham Я не понимаю вашего ответа, я говорю о том, что эта команда меняет что-то вроде 1 января 2001 07:00:00 (не обращайте внимания на формат) на 1 января 2001 года, так что это только дата без времени. - person Dennis Jaheruddin; 11.04.2017
comment
@DennisJaheruddin Вы читали документацию? Вместо этого вы можете использовать DATETIME(timestamp, timezone), если вам нужен результат DateTime. cloud.google.com/bigquery/docs/ ссылка / стандартный-sql / - person Mani Gandham; 11.04.2017
comment
В этом случае я либо пропустил это, либо документы были обновлены с тех пор, как я проверил в феврале. В любом случае приятно, что вы опубликовали этот ответ. - person Dennis Jaheruddin; 12.04.2017

Ваша предпосылка верна. Если вы группируете так, то пользователи, которые хотят EST или EDT, получат неправильную группировку по дате:

GROUP BY UTC_USEC_TO_DAY(ts_field)

Но до тех пор, пока вы выясняете смещение, которое хочет ваш пользователь, вы все равно можете выполнить полный расчет на сервере. Например, если EST отстает от UTC на 5 часов, запросите такой:

GROUP BY UTC_USEC_TO_DAY(ts_field - (5*60*60*1000*1000000) )

Просто настройте «5» на смещение в часах, и все готово. Вот пример, основанный на одном из наборов данных:

SELECT
  COUNT(*) as the_count,
  UTC_USEC_TO_DAY(timestamp * 1000000 - (5*60*60*1000*1000000) ) as the_day
FROM
  [publicdata:samples.wikipedia]
WHERE
  comment CONTAINS 'disaster'
  and timestamp >= 1104537600
GROUP BY
  the_day
ORDER BY
  the_day

Вы можете удалить смещение, чтобы увидеть, как некоторые правки переносятся в разные дни.

person mdahlman    schedule 19.09.2012
comment
Привет, спасибо за отзыв. это определенно будет работать для простых преобразований. Однако переход на летнее время решает проблему, поскольку нельзя просто использовать статическое значение. - person akshah123; 21.09.2012
comment
Согласен: вам нужно ваше приложение (или ваши пользователи!), Чтобы вычислить смещение, которое они хотят. Это не совсем идеальное решение. Вы обязательно пропустите крайние случаи, например, каковы точные границы сегодняшнего дня, когда начинается или заканчивается переход на летнее время. Но это покроет многие потребности. - person mdahlman; 21.09.2012
comment
мы придерживаемся того же подхода. - person pankajmi; 17.12.2014

Чтобы преобразовать любую строку TimeZone DateTime в UTC, можно использовать PARSE_TIMESTAMP, используя поддерживаемые TIMESTAMP форматы в BigQuery.

Например, чтобы преобразовать строку IST (стандартное индийское время) в UTC, используйте следующее:

SAFE.PARSE_TIMESTAMP("%a %b %d %T IST %Y", timeStamp_vendor, "Asia/Kolkata")

Здесь PARSE_TIMESTAMP анализирует строку IST в формате UTC TIMESTAMP (не строку). Добавление SAFE в качестве префикса устраняет ошибки / нули и т. Д.

Чтобы преобразовать это в читаемый строковый формат в BigQuery, используйте FORMAT_TIMESTAMP следующим образом:

FORMAT_TIMESTAMP("%d-%b-%Y %T %Z", SAFE.PARSE_TIMESTAMP("%a %b %d %T IST %Y", timeStamp_vendor, "Asia/Kolkata"))

В этом примере строка IST формата Fri May 12 09:45:12 IST 2019 преобразуется в 12-May-2019 04:15:12 UTC.

Замените IST на требуемый часовой пояс и Asia/Kolkata на соответствующее имя часового пояса, чтобы добиться преобразования для вашего часового пояса.

person Nishant    schedule 13.08.2019

Тем, кто здесь спотыкается:

Если вы делаете очистку данных и попадаете в следующую ситуацию:

  1. у ваших данных правильное время и дата
  2. у ваших данных неправильный часовой пояс
  3. вы хотите сохранить время и дату, но изменить часовой пояс на правильный

Затем используйте

SELECT TIMESTAMP(DATETIME(timestamp_field), '{timezone}')

Пример:

SELECT
    CURRENT_TIMESTAMP(),
    TIMESTAMP(DATETIME(CURRENT_TIMESTAMP()), 'America/Montreal'),

приводит к:

2021-07-01 20:39:49.282752 UTC
2021-07-02 00:39:49.282752 UTC

Надеюсь, это может быть полезно! :)

person Philippe Hebert    schedule 01.07.2021

Для меня функции TIMESTAMP_SUB и TIMESTAMP_ADD сделали свою работу. Когда нужно было преобразовать метку времени из UTC в PST, я использовал:

TIMESTAMP_SUB(`timestamp`, INTERVAL 8 HOUR)
person zaan    schedule 31.03.2021