连接BigQuery和Google表格-DATE参数问题

时间:2019-07-09 14:36:02

标签: date google-sheets google-bigquery

1之后,我开始创建一个从BigQuery读取数据的电子表格,但是在处理与日期值相关的参数时遇到了问题。

在第一张纸上,我创建了2个具有2个参数的单元格,即日期间隔的开始和结束,并带有适当的值。两个单元格的格式都设置为“日期”值。

在第二张工作表中,我配置了BigQuery连接器,在本例中,我使用的是带有日期的公共数据集。 bigquery-public-data.utility_eu.date_greg

在我添加的BigQuery连接器向导中:

"STARTDATE" as "PARAMETERS!B1"
"ENDDATE" as "PARAMETERS!B2"

完成此配置后,将生成以下查询:

SELECT
  date,
  date_str,
  date_int

FROM `bigquery-public-data.utility_eu.date_greg` 

WHERE date > DATE(@STARTDATE) AND date < DATE(@ENDDATE)

LIMIT 10

我直接从编辑器收到以下错误消息:

> Error BigQuery: No matching signature for function DATE for argument types: INT64. Supported signatures: DATE(TIMESTAMP, [STRING]); DATE(DATETIME); DATE(INT64, INT64, INT64) at [8:14]

据我了解,“日期”单元格以数字形式检索,因此直接解析不起作用。经过几次测试,我知道给定的int值是我可以将单元格格式更改为“ number”的数字。 如果您将单元格值从DATE转换为NUMBER,则会得到以下值:

01/05/2019 -> 43.586
31/05/2019 -> 43.616

这个数字是多少?它不是毫秒,而是每隔一天增加1。为了创建可以解析此int的正确查询,我需要了解这个int是什么(当然,我可以将单元格处理为“文本”并直接写入timestamp值,但我希望使用本机日期格式所以我可以使用内置日历。

我的考虑(使用简单的数学方法)是该数字指的是自30/12/1899起的天数,但这很奇怪(此外,这天之前的每个日期始终为0),所以我问您直接如何处理此值。基于对数字计数器何时开始(1899年1月30日)的理解,我创建了此查询,该查询添加了从单元格中检索到的数字:

SELECT *

FROM `bigquery-public-data.utility_eu.date_greg`

WHERE 
  date >= DATE_ADD(DATE("1899-12-30"), INTERVAL @DATAINIZIO DAY)
  AND date <= DATE_ADD(DATE("1899-12-30"), INTERVAL @DATAFINE DAY)

它正在工作...但是我认为我正在执行的解决方法不是正确的方法。

还有,Spreadsheet提供了与此BigQuery连接相关的完整文档吗?除了1中的演示文稿之外,我找不到任何特定的文档。

3 个答案:

答案 0 :(得分:0)

  

这个数字是多少?它不是毫秒,而是每隔一天增加1。

这就是所谓的序列号,表示自“非常开始”以来的天数
Google的电子表格日期日历从1900-01-01开始-被视为“非常开始”

  

为了创建可以解析此int的正确查询,我需要了解什么是int

借助上述信息,您可以调整日期计算,使其与BigQuery期望的结果保持一致

答案 1 :(得分:0)

您提到您的字段已经是日期格式,也许您正在查询中进行额外的解析。

尝试不使用DATE功能。

此外,我发现了另一个文档,不仅与连接有关,而且可能会有所帮助:Getting info from Spreadsheets with BigQuery

答案 2 :(得分:0)

电子表格(Google,Excel等)将日期存储为自开始日期起经过的天数,小数点代表时间。

来自here:“ Excel将日期和时间存储为代表自1900年1月0日以来的天数的数字,再加上24小时中的一小部分:ddddd.tttttt。这称为序列日期或序列日期时间。”

现在,您必须通过查询中的日期进行过滤的方法:

  1. 在查询中,您可以使用DATE_ADD将您的天数(单元格值)添加到基准日期。 (Carefull,DATE_ADD为INT,并且日期值为浮点型,因此需要先进行转换)。
  2. (首选)在电子表格上使用TEXT(单元格,“ yyyy-mm-dd”),以便随后可以在BigQuery查询中使用DATE()。

我使用第二种方法,尽管您需要额外的单元格(除非您将日期直接存储为YYYY-MM-DD;这样可以使查询保持整洁,而不是使用强制转换和date_add。这也可以使您避免使用“上面的链接中解释了“ 1904问题”。