在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中的演示文稿之外,我找不到任何特定的文档。
答案 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。这称为序列日期或序列日期时间。”
现在,您必须通过查询中的日期进行过滤的方法:
我使用第二种方法,尽管您需要额外的单元格(除非您将日期直接存储为YYYY-MM-DD;这样可以使查询保持整洁,而不是使用强制转换和date_add。这也可以使您避免使用“上面的链接中解释了“ 1904问题”。