BigQuery 中的日期比较
Posted
技术标签:
【中文标题】BigQuery 中的日期比较【英文标题】:date comparison in BigQuery 【发布时间】:2017-11-16 15:57:26 【问题描述】:我正在尝试过滤掉查询中的某些日期。我在查询中使用的代码行如下:
(date(date_add(date_time,-1,'year')) < date(date_add(current_date(),-1,'year')) ) OR year(date_time) = 2017)
我们的想法是获取 2017 年年初至今的所有数据,以及对应于同一天的 2016 年数据。因此,如果我要运行我想要的正确版本,它将返回所有年初至今的数据,以及截至 2016 年 11 月 16 日的所有 2016 年数据。
但是,每当我在 WHERE 子句中使用 this 运行查询时,我的查询仍然返回不符合我描述的参数的日期。我可能遗漏了一些完全明显的东西,但这让我发疯了。有没有一种特殊的方法来过滤我错过的日期?
编辑:这是我的一些数据
[date] [today] [uniques]
2016-01-01 2017-11-16 363878
2016-01-02 2017-11-16 383813
2016-01-03 2017-11-16 392579
2016-01-04 2017-11-16 709367
..
..
2016-11-15 2017-11-16 841850
2016-11-16 2017-11-16 847831
2016-11-17 2017-11-16 797610
2016-11-18 2017-11-16 187158
2016-11-19 2017-11-16 521100
..
2017-11-12 2017-11-16 297604
2017-11-13 2017-11-16 527858
2017-11-14 2017-11-16 474051
2017-11-15 2017-11-16 569686
我为自己添加了今天的行,以确保日期格式没有差异。有了这个数据,中间部分的底部 3 行不应该返回,但它们是。其他一切都应该符合我设置并返回的参数。
感谢所有帮助。谢谢!
【问题讨论】:
用文字表达您对日期的预期逻辑是什么?! 很抱歉。我正在尝试获取 2017 年的所有数据以及 2016 年的相应日期。所以今天我将获得 YTD 数据以及截至 11 月 16 日的所有 2016 年数据。 好的,如果能提供一些数据样本就好了——只有几行和预期的结果——你可以阅读How to Ask 并显示Minimal, Complete, and Verifiable example 我又编辑了。感谢您的帮助 [date] 和 [today 字段 - 它们是字符串还是日期类型? 【参考方案1】:以下是 BigQuery 标准 SQL:
#standardSQL
SELECT date_time, uniques
FROM `project.dataset.yourTable`
WHERE (PARSE_DATE('%Y-%m-%d', date_time) < DATE_SUB(CURRENT_DATE(), INTERVAL 1 YEAR))
OR EXTRACT(YEAR FROM PARSE_DATE('%Y-%m-%d', date_time)) = 2017
您可以使用问题中的虚拟数据来测试/玩它,如下所示
#standardSQL
WITH `project.dataset.yourTable` AS (
SELECT '2016-01-01' date_time, 363878 uniques UNION ALL
SELECT '2016-01-02', 383813 UNION ALL
SELECT '2016-01-03', 392579 UNION ALL
SELECT '2016-01-04', 709367 UNION ALL
SELECT '2016-11-15', 841850 UNION ALL
SELECT '2016-11-16', 847831 UNION ALL
SELECT '2016-11-17', 797610 UNION ALL
SELECT '2016-11-18', 187158 UNION ALL
SELECT '2016-11-19', 521100 UNION ALL
SELECT '2017-11-12', 297604 UNION ALL
SELECT '2017-11-13', 527858 UNION ALL
SELECT '2017-11-14', 474051 UNION ALL
SELECT '2017-11-15', 569686
)
SELECT date_time, uniques
FROM `project.dataset.yourTable`
WHERE (PARSE_DATE('%Y-%m-%d', date_time) < DATE_SUB(CURRENT_DATE(), INTERVAL 1 YEAR))
OR EXTRACT(YEAR FROM PARSE_DATE('%Y-%m-%d', date_time)) = 2017
强烈建议使用 BigQuery 标准 SQL - 因此,如果您仍在使用旧版 SQL,请考虑使用 Migrating to Standard SQL
同时,如果您的代码在旧版 sql 中(在我看来是这样) - 您可以在下面使用
#legacySQL
SELECT date_time, uniques
FROM [project:dataset.yourTable]
WHERE (DATE(date_time) < DATE(DATE_ADD(CURRENT_DATE(), -1, 'year')))
OR YEAR(date_time) = 2017
您可以如下测试/玩虚拟数据
#legacySQL
SELECT date_time, uniques
FROM --[project:dataset.yourTable]
(SELECT '2016-01-01' date_time, 363878 uniques),
(SELECT '2016-01-02' date_time, 383813 uniques),
(SELECT '2016-01-03' date_time, 392579 uniques),
(SELECT '2016-01-04' date_time, 709367 uniques),
(SELECT '2016-11-15' date_time, 841850 uniques),
(SELECT '2016-11-16' date_time, 847831 uniques),
(SELECT '2016-11-17' date_time, 797610 uniques),
(SELECT '2016-11-18' date_time, 187158 uniques),
(SELECT '2016-11-19' date_time, 521100 uniques),
(SELECT '2017-11-12' date_time, 297604 uniques),
(SELECT '2017-11-13' date_time, 527858 uniques),
(SELECT '2017-11-14' date_time, 474051 uniques),
(SELECT '2017-11-15' date_time, 569686 uniques)
WHERE (DATE(date_time) < DATE(DATE_ADD(CURRENT_DATE(), -1, 'year')))
OR YEAR(date_time) = 2017
【讨论】:
感谢您的帮助!事实证明我的逻辑没有错,但是我试图帮助修复的查询的人在 CNF 中有他们的过滤器,我没有意识到他的“或”语句之一在括号之外,这导致其他日期显示在满足该条件的地方。 我建议您再次检查答案!根据您的问题 - 您在 WHERE 子句中的初始表达式是错误的!将其与答案中的表达式进行比较-在旧版本中-因此您将苹果与苹果进行比较:o)以上是关于BigQuery 中的日期比较的主要内容,如果未能解决你的问题,请参考以下文章