BigQuery 帮助 - 如何转换并转换为浮点和日期格式
Posted
技术标签:
【中文标题】BigQuery 帮助 - 如何转换并转换为浮点和日期格式【英文标题】:BigQuery Help - How to cast and convert to float and date format 【发布时间】:2019-01-18 21:37:30 【问题描述】:我正在尝试在 BigQuery 中做两件事,但我在这样做时遇到了困难。
我想做两件事:
-
将我的日期列转换为日期格式(目前为
int64
,以43379
为例)
将我的列Delivered_Cost
和Actual_Cost
转换为float
(它们当前为字符串类型) - 当有空值时,有-
而不是0
。当您投射到 float
时,这些 -
s 会自动更改为 0
还是我必须先更新它?
我没有太多经验,而且我在网上寻找解决方案时遇到了困难,所以我很想得到任何帮助!我在同时投射和显示表格中的数据时遇到了困难。
谢谢!
SELECT * FROM TABLE1
CAST(Delivered_Cost as float)
【问题讨论】:
我猜你使用的是标准而不是旧版查询,对吧? 【参考方案1】:将我的日期列转换为Date格式(目前是int64,以43379为例)
使用function PARSE_DATE()
:
PARSE_DATE(Delivered_Date, '%Y-%m-%d')
following doc 列出了支持的格式。
将我的列“Delivered_Cost”和“Actual_Cost”转换为浮动(当前为字符串类型)
CASE()
的语法没问题;你也可以使用快捷方式FLOAT()
。但是,如果您的字符串没有成功映射到浮点数(例如 -
单独),则会发生运行时错误。您可以使用SAFE_CAST()
忽略转换错误,但这也可能导致忽略相关错误。因此,您最好使用REPLACE()
。
这是您的查询:
SELECT
PARSE_DATE(Delivered_Date, '%Y-%m-%d') AS Delivered_Date,
FLOAT(REPLACE(Delivered_Cost, '-', '0')) AS Delivered_Cost,
FLOAT(REPLACE(Actual_Cost, '-', '0')) AS Actual_Cost
FROM MYTABLE
FLOAT(Delivered_Cost)
【讨论】:
谢谢!当我使用下面的代码时,它有点工作: SELECT --PARSE_DATE(START_DATE, '%y-%m-%d') AS START_DATE, float(replace(delivered_cost, '-', '0')) AS Delivered_cost FROM table 但是,'-' 值被更改为 null 而不是 0。此外,当我尝试在同一个查询中执行多个 REPLACE 函数时,我得到一个错误。请参阅下面的代码示例: SELECT --PARSE_DATE(START_DATE, '%y-%m-%d') AS START_DATE, float(replace(delivered_cost, '-', '0')) AS Delivered_cost float(replace (total_planned_units, '-', '0')) AS total_planned_units FROM table 道歉 - 我也是 *** 的新手,所以我不熟悉如何以友好的方式粘贴代码。 所以如果它不适合你,我想你不应该接受答案,以免让其他用户得出错误的结论。终于成功了吗?【参考方案2】:以下是 BigQuery 标准 SQL
#standardSQL
SELECT
DATE_FROM_UNIX_DATE(date_column_as_number_of_days_since_epoch) date_since_epoch,
IFNULL(SAFE_CAST(Delivered_Cost AS FLOAT64), 0.0) AS Delivered_Cost,
IFNULL(SAFE_CAST(Actual_Cost AS FLOAT64), 0.0) AS Actual_Cost
FROM `project.dataset.table`
您可以使用下面的虚拟数据进行测试,玩弄它
#standardSQL
WITH `project.dataset.table` AS (
SELECT
43397 AS date_column_as_number_of_days_since_epoch,
'123' AS Delivered_Cost,
' - ' AS Actual_Cost
)
SELECT
DATE_FROM_UNIX_DATE(date_column_as_number_of_days_since_epoch) date_since_epoch,
IFNULL(SAFE_CAST(Delivered_Cost AS FLOAT64), 0.0) AS Delivered_Cost,
IFNULL(SAFE_CAST(Actual_Cost AS FLOAT64), 0.0) AS Actual_Cost
FROM `project.dataset.table`
结果为
Row date_since_epoch Delivered_Cost Actual_Cost
1 2088-10-25 123.0 0.0
注意:我假设您在问题中用作示例的 43379
实际上是自纪元以来的天数 - 因为从我的假设来看这是最合理的 - 让我们知道这是否是其他原因,所以我会分别调整答案
【讨论】:
以上是关于BigQuery 帮助 - 如何转换并转换为浮点和日期格式的主要内容,如果未能解决你的问题,请参考以下文章
如何将带有 POLYGON 的字符串类型转换为地理类型 - BigQuery