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-292018-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 将字符串转换为日期

如何在 BigQuery 中以字符串格式将工作日月份转换为日期?

如何将日期转换为 CDT 并使用 BigQuery 制作连接字符串?

bigquery 使用时区转换字符串日期时间

将字符串转换为BIGQUERY中的日期当日期格式如下时:M / D / YYYY

从字符串转换 BigQuery 日期