【问题标题】:How to filter on date in Big query如何在大查询中过滤日期
【发布时间】:2017-10-26 12:53:17
【问题描述】:

我试图弄清楚如何在大查询中正确过滤日期。例如在 MS sql 中我会这样做:

Select a, b, date from table_1 where date >= '2017-05-01' 

在大查询中,过滤器不起作用,它会返回所有记录。我试过了

Select a, b, date from table_1 where date >= Date("2017-05-01")
Select a, b, date from table_1 where date >= 2017-05-01
Select a, b, date from table_1 where date >= timestamp('2017-05-01')

这些都不起作用。文档中提到了创建分区表,但我不确定这是我需要做的(我希望不是)。

请帮忙:(

【问题讨论】:

  • date 字段的数据类型是什么?是date 还是string
  • @Mikhail Berlyant 列日期是日期类型
  • 您可能想要展示您的数据示例

标签: mysql google-bigquery


【解决方案1】:

日期列是日期类型

试试下面的例子

#standardSQL
WITH table_1 AS (
  SELECT 1 AS a, 2 AS b, DATE '2017-04-20' AS date UNION ALL
  SELECT 1, 2, DATE '2017-05-20' 
)
SELECT *
FROM table_1
WHERE date > '2017-05-01'

输出是

a   b   date     
1   2   2017-05-20   

【讨论】:

  • 上面的示例是 FOR BigQuery 标准 SQL - 只需在 Web UI 中按原样运行即可!!!我建议您展示您的数据示例 - 这样我们就可以为您提供帮助!。
  • 确保#standardSQL 是查询的一部分,就像示例中一样!
【解决方案2】:

我怀疑你的date 实际上是一个字符串。要在日期比较中使用它,您可以首先将其解析为日期。例如,

#standardSQL
SELECT a, b, date
FROM table_1
WHERE PARSE_DATE('%Y%m%d', date) >= '2017-05-01';

您可以使用一些示例数据尝试查询:

#standardSQL
WITH table_1 AS (
  SELECT 1 AS a, 'foo' AS b, '20170501' AS date UNION ALL
  SELECT 2, 'bar', '20170101' UNION ALL
  SELECT 3, 'baz', '20170625'
)
SELECT a, b, date
FROM table_1
WHERE PARSE_DATE('%Y%m%d', date) >= '2017-05-01';

【讨论】:

  • 我检查了类型,它肯定是日期。我使用了上面的示例,但不幸的是 bigQuery 无法识别函数 parse_date: 2.61 - 2.92: Unrecognized function parse_date
  • 您没有在运行的查询中包含#standardSQL。这是使用 standard SQL 而不是旧版 SQL 所必需的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 2013-08-16
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多