BigQuery 将字符串转换为日期
Posted
技术标签:
【中文标题】BigQuery 将字符串转换为日期【英文标题】:BigQuery convert String to Date 【发布时间】:2019-04-19 14:11:35 【问题描述】:在我的数据集中,创建了一个名为 timestamp 的列,其数据类型为 String。
它包含如下值:
2018-05-30T12:56:27:487+0200
我想构建一个查询,我可以根据 'YYYY-MM-DD' 格式的日期从数据集表中获取所有列。
我想在 DATE Range 之间的 where 子句中使用它。
你能指导一下吗?
谢谢。
【问题讨论】:
:487
是错字吗?
不,我猜,它是从 aws 的 dynamo db 复制到 bigquery 数据集的。价值在生产中,存在。我们正在迁移它。
【参考方案1】:
将字符串转换为日期
以下 BigQuery 标准 SQL 示例
#standardSQL
WITH `project.dataset.table` AS (
SELECT '2018-05-30T12:56:27.487+0200' ts UNION ALL
SELECT '2018-05-30T01:56:27.487+0200'
)
SELECT ts AS ts_as_string,
PARSE_TIMESTAMP('%FT%H:%M:%E3S%z', ts) ts_as_timestamp,
DATE(PARSE_TIMESTAMP('%FT%H:%M:%E3S%z', ts)) ts_as_date
FROM `project.dataset.table`
结果
ts_as_string ts_as_timestamp ts_as_date
2018-05-30T12:56:27.487+0200 2018-05-30 10:56:27.487 UTC 2018-05-30
2018-05-30T01:56:27.487+0200 2018-05-29 23:56:27.487 UTC 2018-05-29
如您所见 - 首先我从字符串中解析时间戳 - 这是重要的部分 - 这是您可以考虑时区的地方(请参阅结果中的日期差异 2018-05-29
与 2018-05-29
)。然后你可以从 TIMESTAMP 中获取 Date
我想在 DATE Range 之间的 where 子句中使用它。
所以,现在您可以在 WHERE 子句中使用 below
WHERE DATE(PARSE_TIMESTAMP('%FT%H:%M:%E3S%z', ts)) BETWEEN date1 AND date2
更新
您可以使用下面来避免处理“错误”格式
PARSE_DATE('%F', SUBSTR(ts, 1, 10))
如果您需要考虑时区 - 您可以在下面使用(在应用 PARSE_TIMESTAMP 之前将 :
修复为 .
)
DATE(PARSE_TIMESTAMP('%FT%H:%M:%E3S%z', FORMAT('%s.%s', SUBSTR(ts, 1, 19), SUBSTR(ts, 21, 8))))
【讨论】:
非常感谢米哈伊尔。我用它:select * from iotdata.Barcelona where MacAddress='b5:54:1f:fb:d6:11' and DATE(PARSE_TIMESTAMP('%FT%H:%M:%E3S%z', Timestamp)) = PARSE_DATE('%Y-%m-%d','2018-05-30');
它抛出错误 Failed to parse input string "2018-05-30T12:56:27:487+0200"
这是因为 :487
部分 - 它应该是 .487
- 查看更新
是的,它奏效了。谢谢。然而,要具备 Bigquery 的能力,这是我使用它的第一个项目。到目前为止只使用了 RDMS。【参考方案2】:
如果要表示同一时区的日期,那么最简单的方法是使用字符串操作并转换为日期:
select PARSE_DATE('%Y-%m-%d', SUBSTR('2018-05-30T12:56:27:487+0200', 1, 10))
【讨论】:
嗨,戈登,谢谢。准确地说,我想这样做: select * from iotdata.Barcelona where MacAddress='a5:54:1e:fb:d6:11' and DATE(SUBSTR(Timestamp, 1, 10))= '2018-05 -30' 但它会引发错误:参数类型的函数 DATE 没有匹配的签名:字符串。支持的签名:DATE(TIMESTAMP, [STRING]);日期(日期时间);日期(INT64,INT64,INT64)在 [2:1] @Arindam 。 . .这让我每次都受益,因为它适用于固定字符串。所以,DATE('2018-01-01')
有效,但 DATE(SUBSTR('2018-01-01', 1, 10))
无效。当然,PARSE_DATE()
是解决办法。以上是关于BigQuery 将字符串转换为日期的主要内容,如果未能解决你的问题,请参考以下文章
如何在 BigQuery 中以字符串格式将工作日月份转换为日期?
如何将日期转换为 CDT 并使用 BigQuery 制作连接字符串?