从 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