Google bigquery 比较日期和时间戳的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_

下面是我在MySQL中使用的示例。但是,在BigQuery中,我的现场
时间戳是日期,我的文档时间戳是时间戳

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`;