Google bigquery 比较日期和时间戳的BigQuery
下面是我在MySQL中使用的示例。但是,在BigQuery中,我的现场Google bigquery 比较日期和时间戳的BigQuery,google-bigquery,Google Bigquery,下面是我在MySQL中使用的示例。但是,在BigQuery中,我的现场时间戳是日期,我的文档时间戳是时间戳 BigQuery在以下查询中遇到问题,因为我收到消息: 参数类型:DATE的函数日期没有匹配的签名。支持的签名:日期(时间戳,[STRING]);日期(DATETIME);日期(INT64,INT64,INT64)在[8:146] 有人知道我需要做什么才能使查询能够比较日期和时间戳吗 架构(MySQL v5.7) 查询#1 SELECT IFNULL(OnSite.worksite_
时间戳是日期,我的文档时间戳是时间戳
BigQuery在以下查询中遇到问题,因为我收到消息:
参数类型:DATE的函数日期没有匹配的签名。支持的签名:日期(时间戳,[STRING]);日期(DATETIME);日期(INT64,INT64,INT64)在[8:146]
有人知道我需要做什么才能使查询能够比较日期和时间戳吗
架构(MySQL v5.7)
查询#1
SELECT
IFNULL(OnSite.worksite_id, Documents.worksite_id) as `Worksite`,
DATE(IFNULL(OnSite.timestamp, Documents.timestamp)) as `Date`,
COUNT(Documents.worksite_id) as `Users_on_Site`,
COUNT(DISTINCT OnSite.uid) as `Completed`
FROM OnSite
LEFT JOIN Documents ON OnSite.worksite_id = Documents.worksite_id AND DATE(OnSite.timestamp) = DATE(Documents.timestamp)
GROUP BY `Date`, `Worksite`;
| Worksite | Date | Users_on_Site | Completed |
| ---------- | ---------- | ------------- | --------- |
| worksite_1 | 2019-01-01 | 2 | 2 |
| worksite_1 | 2019-01-02 | 0 | 2 |
| worksite_1 | 2019-01-03 | 1 | 1 |
| worksite_1 | 2019-01-04 | 0 | 1 |
| worksite_1 | 2019-01-05 | 2 | 2 |
| worksite_1 | 2019-01-06 | 0 | 2 |
在中,说明了日期
函数接受以下输入:
日期(年、月、日)
:根据表示年、月和日的INT64值构造日期
日期(时间戳表达式[,时区])
:将时间戳表达式转换为日期数据类型。它支持一个可选参数来指定时区。如果未指定时区,则使用默认时区UTC
在您的用例中,您传递给DATE
的值似乎已经是datetime。为此,您可以使用DATETIME\u TRUNC
,如:
DATETIME_TRUNC(IFNULL(OnSite.timestamp, Documents.timestamp), DAY)
下面是BigQuery标准SQL
#standardSQL
SELECT
IFNULL(OnSite.worksite_id, Documents.worksite_id) AS `Worksite`,
IFNULL(OnSite.timestamp, DATE(Documents.timestamp)) AS `DATE`,
COUNT(Documents.worksite_id) AS `Users_on_Site`,
COUNT(DISTINCT OnSite.uid) AS `Completed`
FROM `project.dataset.OnSite` OnSite
LEFT JOIN `project.dataset.Documents` Documents
ON OnSite.worksite_id = Documents.worksite_id
AND OnSite.timestamp = DATE(Documents.timestamp)
GROUP BY `DATE`, `Worksite`
如果要应用于您问题中的样本数据
WITH `project.dataset.OnSite` AS (
SELECT "u12345" uid, "worksite_1" worksite_id, DATE '2019-01-01' `TIMESTAMP` UNION ALL
SELECT "u12345", "worksite_1", '2019-01-02' UNION ALL
SELECT "u12345", "worksite_1", '2019-01-03' UNION ALL
SELECT "u12345", "worksite_1", '2019-01-04' UNION ALL
SELECT "u12345", "worksite_1", '2019-01-05' UNION ALL
SELECT "u12345", "worksite_1", '2019-01-06' UNION ALL
SELECT "u1", "worksite_1", '2019-01-01' UNION ALL
SELECT "u1", "worksite_1", '2019-01-02' UNION ALL
SELECT "u1", "worksite_1", '2019-01-05' UNION ALL
SELECT "u1", "worksite_1", '2019-01-06'
), `project.dataset.Documents` AS (
SELECT "1" document_id, "u12345" uid, "worksite_1" worksite_id, 'work_permit' type, TIMESTAMP '2019-01-01 00:00:00' `TIMESTAMP` UNION ALL
SELECT "2", "u12345", "worksite_2", 'job', '2019-01-02 00:00:00' UNION ALL
SELECT "3", "u12345", "worksite_1", 'work_permit', '2019-01-03 00:00:00' UNION ALL
SELECT "4", "u12345", "worksite_2", 'job', '2019-01-04 00:00:00' UNION ALL
SELECT "5", "u12345", "worksite_1", 'work_permit', '2019-01-05 00:00:00' UNION ALL
SELECT "6", "u12345", "worksite_2", 'job', '2019-01-06 00:00:00' UNION ALL
SELECT "7", "u12345", "worksite_1", 'work_permit', '2019-01-07 00:00:00' UNION ALL
SELECT "8", "u12345", "worksite_2", 'work_permit', '2019-01-09 00:00:00' UNION ALL
SELECT "9", "u12345", "worksite_1", 'job', '2019-01-09 00:00:00' UNION ALL
SELECT "10", "u12345", "worksite_2", 'work_permit', '2019-01-09 00:00:00' UNION ALL
SELECT "11", "u12345", "worksite_1", 'work_permit', '2019-01-09 00:00:00' UNION ALL
SELECT "12", "u12345", "worksite_2", 'work_permit', '2019-01-09 00:00:00' UNION ALL
SELECT "13", "u12345", "worksite_1", 'job', '2019-01-09 00:00:00' UNION ALL
SELECT "14", "u12345", "worksite_2", 'work_permit', '2019-01-09 00:00:00' UNION ALL
SELECT "15", "u12345", "worksite_1", 'work_permit', '2019-01-09 00:00:00'
)
结果将如预期的那样
Row Worksite Date Users_on_Site Completed
1 worksite_1 2019-01-01 2 2
2 worksite_1 2019-01-02 0 2
3 worksite_1 2019-01-03 1 1
4 worksite_1 2019-01-04 0 1
5 worksite_1 2019-01-05 2 2
6 worksite_1 2019-01-06 0 2
你为什么不强制施展一切,让生活变得更轻松:-)?所有这些都应该起作用:
select
date(timestamp('2019-01-02')),
date(timestamp('2019-01-02 00:00:00')),
date(timestamp(null)))
因此,在if null语句中:
SELECT
IFNULL(OnSite.worksite_id, Documents.worksite_id) as `Worksite`,
IFNULL(date(datetime(OnSite.timestamp)),date(datetime(Documents.timestamp))) as `Date`,
COUNT(Documents.worksite_id) as `Users_on_Site`,
COUNT(DISTINCT OnSite.uid) as `Completed`
FROM OnSite
LEFT JOIN Documents ON OnSite.worksite_id = Documents.worksite_id AND DATE(datetime(OnSite.timestamp)) = DATE(datetime(Documents.timestamp))
GROUP BY `Date`, `Worksite`;
如果您使用SQL类型转换,例如LEFT-JOIN-Documents ON-site.worksite\u id=Documents.worksite\u id和DATE(TIMESTAMP-site.TIMESTAMP)=DATE(TIMESTAMP-Documents.TIMESTAMP)
或LEFT-JOIN-Documents ON-site\u id=Documents.worksite\u id和DATE(site.TIMESTAMP::TIMESTAMP)=DATE(Documents.TIMESTAMP::TIMESTAMP)
?你需要清楚你使用的是什么-mysql
或bigquery
@mikhailberlyan对不起,我以为我的标题很清楚。我给这两个都加了标签,因为我觉得它们是相似的技能集,但我会确保删除mysql标签。我真的建议你使用合适的标签,因为这会误导你,最终导致“垃圾”answers@MikhailBerlyant绝对同意。我在第9行遇到了一个奇怪的错误:on OnSite.worksite\u id=Documentimestamp.worksite\u id
(无法识别的名称)Yayk。打字错误-现在将修复shortlycheck。抱歉,这是我侧边上的复制/粘贴问题嗯,出于某种原因,当我将其放入BigQuery时,这是同一行上的同一个问题。我认为您可以在现场执行-。时间戳介于“2019-01-01”和“2019-10-10”
-这里没有任何“黑客行为”-通常的过滤方式
SELECT
IFNULL(OnSite.worksite_id, Documents.worksite_id) as `Worksite`,
IFNULL(date(datetime(OnSite.timestamp)),date(datetime(Documents.timestamp))) as `Date`,
COUNT(Documents.worksite_id) as `Users_on_Site`,
COUNT(DISTINCT OnSite.uid) as `Completed`
FROM OnSite
LEFT JOIN Documents ON OnSite.worksite_id = Documents.worksite_id AND DATE(datetime(OnSite.timestamp)) = DATE(datetime(Documents.timestamp))
GROUP BY `Date`, `Worksite`;