在 BigQuery 中将 Firebase 时间戳转换为 Date/Time - 在同一查询中再次引用计算字段?

Casting a Firebase timestamp to a Date/Time in BigQuery - referencing a computed field again in the same query?

我不是编码员,而且非常盲目,所以请原谅这个查询的简单性。

我正在使用 Firebase 扩展“将集合流式传输到 BigQuery”将 Firebase Firestore 更新流式传输到 BigQuery table,然后我将其链接为 Google Data Studio 中的数据源。这目前正在按预期工作。

我有两个问题:

  1. 是否有更有效的方法将 Firebase 时间戳转换为 BigQuery Date/Time 值? Firebase 时间戳在 BigQuery table 中以 JSON 格式显示如下:

    {"created_time":{"_seconds":1647554254,"_nanoseconds":234000000}}

    我的 BigQuery SQL 转换它(有效)的代码是:

    DATETIME(TIMESTAMP_SECONDS(CAST(JSON_VALUE(DATA,'$.created_time._seconds') AS int64)),"Africa/Johannesburg") AS createDate

    是否有更有效的方法来做到这一点,或者这是否合理?

  2. 如何在同一查询中的另一个计算字段 ageDays 中引用 createDate 计算字段(上图)?我没有在 Google 或 Whosebug 中找到它,要么是因为措辞不佳,要么是它的查询太基础了。我尝试使用 table 别名引用 createDate 计算字段(例如 T.createDate),但没有骰子。因此,我非常丑陋的解决方法只是在我的新计算列 ageDays 中完整地重新执行 createDate 计算(感觉不对),如下所示:

    DATE_DIFF(current_date("Africa/Johannesburg"),DATETIME(TIMESTAMP_SECONDS(CAST(JSON_VALUE(DATA,'$.created_time._seconds') AS int64)),"Africa/Johannesburg"), DAY) AS ageDays

非常感谢任何见解 - 非常感谢。

根据您的要求,也可以使用 JSON_EXTRACT 代替 JSON_VALUE。您可以使用下面的查询来获得预期的输出。

select
 date(timestamp_seconds(cast(json_extract( data , '$.created_time._seconds') as int64))) AS Date_Created
from `project.dataset.timetable` 

输出

Table alias cannot be used to reference a field in another column with a SELECT 语句,因为它的可见性有限。别名可以与 SELECT 语句中的 Order By、Group By 或 Having 子句一起使用。获得 ageDays 的最佳方法是再次计算整个 createDate 字段。