Как я могу извлечь дату из эпохи в BigQuery SQL

  • У меня есть дата, хранящаяся в Epoch Time, и я хочу извлечь Date от него. Я попробовал код ниже, и я получаю null как вывод.

    date_add( (timestamp( Hp.ASSIGN_TIME)), 1970-01-01,"second" ) as Extracted_date_Epoch
    

    Формат времени EX (1424184621000000)

  • Еще один вопрос. Код ниже дает мне дни правильно, но не рабочие дни, он дает все дни, возможно ли получить только рабочие дни между двумя моментами, хранящимися в эпоху Epoch?

    INTEGER(((Hp.ASSIGN_TIME - Hp.ARRIVAL_TIME) / 1000000) / 86400) as Days
    

Ответ 1

Для преобразования timestamp в date вы можете использовать функции даты/времени BigQuery:

SELECT TIMESTAMP(1424184621000000)         # 2015-02-17 14:50:21 UTC    
SELECT TIMESTAMP_MICROS(1230219000000000)  # 2008-12-25 15:30:00 UTC
SELECT TIMESTAMP_MILLIS(1230219000000)     # 2008-12-25 15:30:00 UTC
SELECT DATE(TIMESTAMP(1424184621000000))   # 2015-02-17 
SELECT DATE(TIMESTAMP('2015-02-17'))       # 2015-02-17 
SELECT INTEGER(TIMESTAMP('2015-02-17'))    # 1424131200000000

Чтобы рассчитать количество дней между двумя датами (например, между 6/1/15 и 6/20/15), вы можете сделать это:

SELECT (DATEDIFF(TIMESTAMP('2015-06-20'), TIMESTAMP('2015-06-01')) + 1)

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

SELECT
   (DATEDIFF(TIMESTAMP('2015-06-20'), TIMESTAMP('2015-06-01')) + 1)
  -(INTEGER((DATEDIFF(TIMESTAMP('2015-06-20'), TIMESTAMP('2015-06-01')) + 1) / 7) * 2)
  -(CASE WHEN DAYOFWEEK(TIMESTAMP('2015-06-01')) = 1 THEN 1 ELSE 0 END)
  -(CASE WHEN DAYOFWEEK(TIMESTAMP('2015-06-20')) = 7 THEN 1 ELSE 0 END)

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

Ответ 2

Если вы используете стандартный диалект SQL в BigQuery, эта функция выполняет преобразование в удобочитаемую временную метку TIMESTAMP_MICROS (1424184621000000) → 2015-02-17 14:50:21 UTC. Ссылка: https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#timestamp-string

Или TIMESTAMP_SECONDS(visitStartTime) на несколько секунд, например, в Google Analytics.

Ответ 3

Если у вас есть опция Legacy SQL, чтобы ответить на вопрос 1, учитывая столбец времени эпохи UNIX в миллисекундах, например 1524375336000,

Я использовал SELECT USEC_TO_TIMESTAMP(Hp.ASSIGN_TIME * 1000) AS the_date FROM table;

╔═══╦═══════════════╦═════════════════════════════╗
║   ║ ASSIGN_TIME   ║ the_date                    ║
╠═══╬═══════════════╬═════════════════════════════╣
║ 1 ║ 1524375336000 ║ 2018-04-22 05:35:36.000 UTC ║
╚═══╩═══════════════╩═════════════════════════════╝

USEC_TO_TIMESTAMP(<expr>) Преобразует метку времени UNIX в микросекундах в тип данных TIMESTAMP.

Пример:

SELECT USEC_TO_TIMESTAMP(1349053323000000);

https://cloud.google.com/bigquery/docs/reference/legacy-sql#usec_to_timestamp