从 Airtable 到 Big Query 中正确且真实的 DateStamp 的十进制字符串样式
Posted
技术标签:
【中文标题】从 Airtable 到 Big Query 中正确且真实的 DateStamp 的十进制字符串样式【英文标题】:A Decimal String Style of Datestamp from an Airtable to a Correct and True DateStamp in a Big Query 【发布时间】:2021-12-19 09:09:50 【问题描述】:在 Airtable 中 DateTime 数据是正确的,但如果您在 Big Query 中上传它,它将转换为数字的十进制字符串样式。见下表:
Date | True Date |
---|---|
44493.61666667 | 2021-10-24T14:48:00 |
44522.775 | 2021-11-22T18:36:00 |
44493.67916666667 | 2021-10-24T16:18:00 |
44522.739583333336 | 2021-11-22T17:45:00 |
这是我遇到的问题。假设表名是 Airtable。您能否提供建议的查询以将其转换为正确且真实的时间戳? 其实我也发on my blog。感谢您提供建议的答案。
【问题讨论】:
【参考方案1】:我无权访问 BigQuery -
但我发现您的"Date"
值是自TIMESTAMP '1899-12-30 00:00:00'
以来的秒到天(秒/ 86400)的除法:
WITH
airtable(date,true_date) AS (
SELECT 44493.61666666667 ,TIMESTAMP '2021-10-24T14:48:00'
UNION ALL SELECT 44522.775 ,TIMESTAMP '2021-11-22T18:36:00'
UNION ALL SELECT 44493.67916666667 ,TIMESTAMP '2021-10-24T16:18:00'
UNION ALL SELECT 44522.739583333336,TIMESTAMP '2021-11-22T17:45:00'
)
SELECT
*
, true_date - "date" AS anchor_ts
, CAST (("date" * 86400) AS INTEGER) AS secs_snc_anchor
FROM airtable;
-- out date | true_date | anchor_ts | secs_snc_anchor
-- out --------------------+---------------------+---------------------+-----------------
-- out 44493.616666666670 | 2021-10-24 14:48:00 | 1899-12-30 00:00:00 | 3844248480
-- out 44522.775000000000 | 2021-11-22 18:36:00 | 1899-12-30 00:00:00 | 3846767760
-- out 44493.679166666670 | 2021-10-24 16:18:00 | 1899-12-30 00:00:00 | 3844253880
-- out 44522.739583333336 | 2021-11-22 17:45:00 | 1899-12-30 00:00:00 | 3846764700
因此,您可以将您的 "Date"
值添加到 TIMESTAMP '1899-12-30 00:00:00'
以获得您想要的值。
在许多数据库(Oracle、PostgreSQL、Vertica 等)中,它就像在下面的查询中一样。
在 Big Query 中,它应该是:
TIMESTAMP_ADD(TIMESTAMP "1899-12-30 00:00:00", INTERVAL "Date" MINUTE) AS calculated_ts
.
在第二个查询中,我将 "Date"
重命名为 dt
,因为我避免使用数据库对象的保留字(在本例中为类型指示符)。
WITH
airtable(dt,true_date) AS (
SELECT 44493.61666666667 ,TIMESTAMP '2021-10-24T14:48:00'
UNION ALL SELECT 44522.775 ,TIMESTAMP '2021-11-22T18:36:00'
UNION ALL SELECT 44493.67916666667 ,TIMESTAMP '2021-10-24T16:18:00'
UNION ALL SELECT 44522.739583333336,TIMESTAMP '2021-11-22T17:45:00'
)
SELECT
*
, TIMESTAMPADD(ss,CAST ((dt * 86400) AS INTEGER), TIMESTAMP '1899-12-30 00:00:00') AS derived_ts
FROM airtable;
-- out dt | true_date | derived_ts
-- out --------------------+---------------------+---------------------
-- out 44493.616666666670 | 2021-10-24 14:48:00 | 2021-10-24 14:48:00
-- out 44522.775000000000 | 2021-11-22 18:36:00 | 2021-11-22 18:36:00
-- out 44493.679166666670 | 2021-10-24 16:18:00 | 2021-10-24 16:18:00
-- out 44522.739583333336 | 2021-11-22 17:45:00 | 2021-11-22 17:45:00
【讨论】:
哇太棒了。我只是想知道为什么是 1899-12-30。我也查询了它,但它比你的要长。链接:theaccountingtactics.com/2022/01/…【参考方案2】:您能否给出建议的查询以将其转换为正确且真实的时间戳?
使用以下表达式timestamp_seconds(cast((date - 25569) * 86400 as int))
您可以使用问题中的示例数据对其进行测试,如下例所示
with airtable as (
select 44493.61666666667 date, '2021-10-24T14:48:00' expected_true_date union all
select 44522.775 , '2021-11-22T18:36:00' union all
select 44493.67916666667 , '2021-10-24T16:18:00' union all
select 44522.739583333336, '2021-11-22T17:45:00'
)
select *,
timestamp_seconds(cast((date - 25569) * 86400 as int)) calculated_true_date
from airtable
输出
【讨论】:
以上是关于从 Airtable 到 Big Query 中正确且真实的 DateStamp 的十进制字符串样式的主要内容,如果未能解决你的问题,请参考以下文章
将数据流从 Google Cloud Storage 流式传输到 Big Query
将数据从 Oracle Golden Gate 馈送到 Big Query 的最佳方式是啥
如何从 Big Query cli 运行保存的查询并将结果导出到 CSV?
Python GAE - 如何以编程方式将数据从备份导出到 Big Query?
Big Query 在从一个表插入到另一个表时指定 _PARTITIONTIME
使用 Azure 数据工厂将数据从 Google Big Query 移动到 Azure Data Lake Store