无法从 BigQuery 中的时间戳中提取日期

Posted

技术标签:

【中文标题】无法从 BigQuery 中的时间戳中提取日期【英文标题】:Can't Extract Date from Timestamp in BigQuery 【发布时间】:2016-08-29 03:01:06 【问题描述】:

我正在尝试获取上周与特定实体 ID 关联的所有行。每行都有一个时间戳。我想通过从日期时间时间戳中提取日期来按天对这些实体进行分组,但是当我尝试时,我得到了

错误: (L6:28): GROUP BY 中的表达式 STRFTIME_UTC_USEC([data_timestamp], '%Y-%m-%d') 无效

来自大查询。 DATE() 函数似乎有问题。

这是我正在运行的完整查询:

SELECT Count(*) FROM [myproj:mydataset.mytable] 
WHERE 
    bool_property=False 
AND 
    entity_id=5667423172689920 
AND
    DATEDIFF(CURRENT_DATE(), data_timestamp) <= 7
GROUP BY DATE(data_timestamp)

查看数据,看起来质量,这里称为“data_timestamp”,实际上是一个正确的时间戳;我真的不明白为什么 DATE() 函数会失败。

任何帮助或提示?谢谢!

【问题讨论】:

【参考方案1】:

您的查询有两个问题

    在 BigQuery Legacy SQL 中,您不能在 GROUP BY 语句中使用表达式, 而只是字段(顺便说一句,BigQuery 标准 SQL 中不存在此限制) 当您执行 GROUP BY 时 - 您不能只是简单地选择所有字段,而是需要使用一些聚合函数,例如 COUNT 或 SUM 等(对于那些不属于 GROUP VY 的字段)

所以您的查询可能如下所示:

SELECT DATE(data_timestamp) AS dt, COUNT(1) AS cnt 
FROM [myproj:mydataset.mytable] 
WHERE bool_property=FALSE 
AND entity_id=5667423172689920 
AND DATEDIFF(CURRENT_DATE(), data_timestamp) <= 7
GROUP BY dt

【讨论】:

好吧,看来我使用的是标准 sql,因为我已经使用 'GROUP BY' 测试了其他查询,它们似乎工作正常。不过,您对聚合函数的看法是正确的。我改变了我的问题以适应。我真正的问题不是 GROUP BY,而是 DATE 函数,这似乎不合逻辑地不起作用。 基于您使用的语法 - 您使用的是旧版 sql。您是否尝试在我的答案中运行查询?问题不在于日期函数,而实际上是您在旧版 sql 中的 group by 语句中使用了它 是的,这完全有效!虽然,我不确定我明白为什么。我想你的理论/假设是日期函数没有工作,因为它在 GROUP BY 中?介意多解释一下这个查询是如何工作的吗? 正如我已经解释过的 - 在 bigquery 遗留 sql 中,您不能在 group by 语句中使用表达式,而是需要在 select 语句 DATE(data_timestamp) AS dt 中预先计算此表达式,然后使用新的“字段”(@987654323 @) 分组。这是通常的做法 啊我明白了,不是 GROUP BY 不行,是里面的表达式。惊人的。非常感谢!【参考方案2】:

不幸的是,旧版 SQL 不允许使用 GROUP BY 表达式,只能使用列名。但是使用标准 SQL,您可以做到:

SELECT * FROM myproj.mydataset.mytable
WHERE 
    bool_property=False AND 
    entity_id=5667423172689920 AND
    DATE_DIFF(CURRENT_DATE(), EXTRACT(DATE FROM data_timestamp), DAY) <= 7
GROUP BY EXTRACT(DATE FROM data_timestamp)

【讨论】:

似乎 bigquery 确实包含 group by 虽然 cloud.google.com/bigquery/query-reference

以上是关于无法从 BigQuery 中的时间戳中提取日期的主要内容,如果未能解决你的问题,请参考以下文章

如何从java中的字符串时间戳中提取日期和时间

如何从R中具有月份名称的时间戳中提取日期

如何从Django中的时间戳中仅提取一天

pandas:从时间戳中提取日期和时间

pandas:从时间戳中提取日期和时间

从时间戳中提取时间?