BigQuery 日期和时间函数在时间戳列上返回 NULL
BigQuery Date and Time Functions returning NULL on a timestamp column
我正在使用 LAG() 和 LEAD() 从 table 中的一个时间戳列中提取 3 个时间戳列:时间戳、prev_timestamp、next_timestamp。我需要做一些简单的日期和时间格式化,但是当我在 prev_timestamp 或 next_timestamp 上使用像 MONTH() 这样的函数时,它 returns NULL.
结果列的架构类型是正确的 (TIMESTAMP),并且出于某种原因,常规时间戳日期和时间格式有效。我该如何做到 returns 所有 3 列的月份都正确?
returns 时间戳列的月份和上一个和下一个时间戳列的 NULL 的示例代码:
SELECT
MONTH(timestamp) AS month,
MONTH(prev_timestamp) AS prev_month,
MONTH(next_timestamp) AS next_month
FROM (
SELECT
timestamp,
LAG(timestamp,1) OVER (PARTITION BY id ORDER BY timestamp) prev_timestamp,
LEAD(timestamp,1) OVER (PARTITION BY id ORDER BY timestamp) next_timestamp
FROM timestamp_table
)
试试下面
SELECT
MONTH(MSEC_TO_TIMESTAMP(timestamp)) AS month,
MONTH(MSEC_TO_TIMESTAMP(prev_timestamp)) AS prev_month,
MONTH(MSEC_TO_TIMESTAMP(next_timestamp)) AS next_month
FROM (
SELECT
timestamp,
LAG(timestamp,1) OVER (PARTITION BY id ORDER BY timestamp) prev_timestamp,
LEAD(timestamp,1) OVER (PARTITION BY id ORDER BY timestamp) next_timestamp
FROM timestamp_table
)
所以在测试和检查了几件事之后,我实际上从 中启发了自己并意识到他的答案是不正确的,因为 lag/lead 没有 return 毫秒,但是微秒(为什么?这是任何人的猜测)。
SELECT
MONTH(timestamp) AS month,
MONTH(MSEC_TO_TIMESTAMP((prev_timestamp/1000))) AS prev_month,
MONTH(MSEC_TO_TIMESTAMP((next_timestamp/1000))) AS next_month
FROM (
SELECT
timestamp,
LAG(timestamp,1) OVER (PARTITION BY id ORDER BY timestamp) prev_timestamp,
LEAD(timestamp,1) OVER (PARTITION BY id ORDER BY timestamp) next_timestamp
FROM timestamp_table
)
应该可以。我刚刚测试了创建一个包含三行时间戳的 table。在没有 /1000 的情况下使用它,我的 lagged/lead 版本给出了不同的月份。我测试了结果,如果你不做除法,你最终会在第 47 个千年的某个地方。
我正在使用 LAG() 和 LEAD() 从 table 中的一个时间戳列中提取 3 个时间戳列:时间戳、prev_timestamp、next_timestamp。我需要做一些简单的日期和时间格式化,但是当我在 prev_timestamp 或 next_timestamp 上使用像 MONTH() 这样的函数时,它 returns NULL.
结果列的架构类型是正确的 (TIMESTAMP),并且出于某种原因,常规时间戳日期和时间格式有效。我该如何做到 returns 所有 3 列的月份都正确?
returns 时间戳列的月份和上一个和下一个时间戳列的 NULL 的示例代码:
SELECT
MONTH(timestamp) AS month,
MONTH(prev_timestamp) AS prev_month,
MONTH(next_timestamp) AS next_month
FROM (
SELECT
timestamp,
LAG(timestamp,1) OVER (PARTITION BY id ORDER BY timestamp) prev_timestamp,
LEAD(timestamp,1) OVER (PARTITION BY id ORDER BY timestamp) next_timestamp
FROM timestamp_table
)
试试下面
SELECT
MONTH(MSEC_TO_TIMESTAMP(timestamp)) AS month,
MONTH(MSEC_TO_TIMESTAMP(prev_timestamp)) AS prev_month,
MONTH(MSEC_TO_TIMESTAMP(next_timestamp)) AS next_month
FROM (
SELECT
timestamp,
LAG(timestamp,1) OVER (PARTITION BY id ORDER BY timestamp) prev_timestamp,
LEAD(timestamp,1) OVER (PARTITION BY id ORDER BY timestamp) next_timestamp
FROM timestamp_table
)
所以在测试和检查了几件事之后,我实际上从
SELECT
MONTH(timestamp) AS month,
MONTH(MSEC_TO_TIMESTAMP((prev_timestamp/1000))) AS prev_month,
MONTH(MSEC_TO_TIMESTAMP((next_timestamp/1000))) AS next_month
FROM (
SELECT
timestamp,
LAG(timestamp,1) OVER (PARTITION BY id ORDER BY timestamp) prev_timestamp,
LEAD(timestamp,1) OVER (PARTITION BY id ORDER BY timestamp) next_timestamp
FROM timestamp_table
)
应该可以。我刚刚测试了创建一个包含三行时间戳的 table。在没有 /1000 的情况下使用它,我的 lagged/lead 版本给出了不同的月份。我测试了结果,如果你不做除法,你最终会在第 47 个千年的某个地方。