列类型 TIMESTAMP 的 BigQuery 导入转换日期时间 offset/timezone,但列类型 DATETIME 因“日期时间字符串无效”而失败
BigQuery import for column type TIMESTAMP converts datetime offset/timezone, but column type DATETIME fails with `Invalid datetime string`
使用 TIMESTAMP 列类型时,BigQuery 似乎采用类似
的格式
2021-07-14 00:02:30.917983+02:00
(使用 datime.isoformat(sep = ' ') 生成,因为 TIMESTAMP 不支持带 T 分隔符的 iso 格式)
然后将其转换为 UTC:
2021-07-14 00:04:30.917983 UTC
因为我想要本地时间,所以我尝试创建一个 DATETIME 类型的新列
JSON 我正在尝试导入:
"load_time_local": "2021-07-15 02:01:02.478638+02:00",
"load_time_local2": "2021-07-15 02:01:02.478638+02:00"
伴随架构:
{
"name": "load_time_local",
"type": "TIMESTAMP",
"mode": "REQUIRED"
},
{
"name": "load_time_local2",
"type": "DATETIME",
"mode": "NULLABLE"
},
这会导致错误:
Invalid datetime string "2021-07-15 02:01:02.478638+02:00" Field: load_time_local2;
Big Query 是否支持时区或日期时间偏移?还是我必须去除偏移量并导入为当地时间?
如果我想捕获时区信息,我需要两列包含 utc + 本地时间或本地时间 + 偏移量?
文档对此不是很清楚。
将日期时间数据导入 Big Query 时:
- 您不能指定时区
- Bigquery 需要
YYYY-MM-DD hh:mm:ss
格式(类似于 ISODate,但使用 space 而不是 T
字符)。
- 所有日期时间必须采用 UTC 才能插入。
当您从大查询中查询时,您可以使用时区(事实上,您应该):
select * from `myproject.mydateset.csvimport`
where timestamp_field_0 > '2020-01-01T10:00:00+2'
如果您需要记录此日期时的原始时区(因为人类需要看到它),最简单的方法是将时区记录在相同的 table 中。幸运的是,Bigquery 是一个列式数据库,时区信息几乎不需要存储,因为它会被 bigquery 压缩。
注意在 BigQuery 中存储正确的时区!
不要存储像 'Europe/Madrid' 这样的地理时区,因为当查询 运行 计算本地时间时,BigQuery 将使用与 UTC 的当前偏移量。
存储适当的时区,如 CET、CEST、EST、EDT 等
这样你就可以在查询过程中轻松转换它:
select STRING(utc_timestamp, timezone) from table
Big Query 不支持关于日期的时区信息...但是时间戳总是预期为 UTC,这就是为什么它在导入时接受偏移量,但随后将其转换回 UTC。
为了将本地时间放入 DATETIME 字段,必须删除时区偏移信息。
使用 python 这有效:
berlin = pytz.timezone('Europe/Berlin')
datetime.now(berlin).replace(tzinfo=None).isoformat()
使用 TIMESTAMP 列类型时,BigQuery 似乎采用类似
的格式2021-07-14 00:02:30.917983+02:00
(使用 datime.isoformat(sep = ' ') 生成,因为 TIMESTAMP 不支持带 T 分隔符的 iso 格式)
然后将其转换为 UTC:
2021-07-14 00:04:30.917983 UTC
因为我想要本地时间,所以我尝试创建一个 DATETIME 类型的新列
JSON 我正在尝试导入:
"load_time_local": "2021-07-15 02:01:02.478638+02:00",
"load_time_local2": "2021-07-15 02:01:02.478638+02:00"
伴随架构:
{
"name": "load_time_local",
"type": "TIMESTAMP",
"mode": "REQUIRED"
},
{
"name": "load_time_local2",
"type": "DATETIME",
"mode": "NULLABLE"
},
这会导致错误:
Invalid datetime string "2021-07-15 02:01:02.478638+02:00" Field: load_time_local2;
Big Query 是否支持时区或日期时间偏移?还是我必须去除偏移量并导入为当地时间?
如果我想捕获时区信息,我需要两列包含 utc + 本地时间或本地时间 + 偏移量?
文档对此不是很清楚。
将日期时间数据导入 Big Query 时:
- 您不能指定时区
- Bigquery 需要
YYYY-MM-DD hh:mm:ss
格式(类似于 ISODate,但使用 space 而不是T
字符)。 - 所有日期时间必须采用 UTC 才能插入。
当您从大查询中查询时,您可以使用时区(事实上,您应该):
select * from `myproject.mydateset.csvimport`
where timestamp_field_0 > '2020-01-01T10:00:00+2'
如果您需要记录此日期时的原始时区(因为人类需要看到它),最简单的方法是将时区记录在相同的 table 中。幸运的是,Bigquery 是一个列式数据库,时区信息几乎不需要存储,因为它会被 bigquery 压缩。
注意在 BigQuery 中存储正确的时区! 不要存储像 'Europe/Madrid' 这样的地理时区,因为当查询 运行 计算本地时间时,BigQuery 将使用与 UTC 的当前偏移量。 存储适当的时区,如 CET、CEST、EST、EDT 等
这样你就可以在查询过程中轻松转换它:
select STRING(utc_timestamp, timezone) from table
Big Query 不支持关于日期的时区信息...但是时间戳总是预期为 UTC,这就是为什么它在导入时接受偏移量,但随后将其转换回 UTC。
为了将本地时间放入 DATETIME 字段,必须删除时区偏移信息。
使用 python 这有效:
berlin = pytz.timezone('Europe/Berlin')
datetime.now(berlin).replace(tzinfo=None).isoformat()