BigQuery:将 mm/yyyy 日期与特定日期和 CURRENT_DATE 进行比较

Posted

技术标签:

【中文标题】BigQuery:将 mm/yyyy 日期与特定日期和 CURRENT_DATE 进行比较【英文标题】:BigQuery: Compare mm/yyyy date to specific date and CURRENT_DATE 【发布时间】:2019-05-21 13:38:15 【问题描述】:

我在名为actual_date 的列中将日期格式设置为mm/yyyy(例如11/2018)。我需要选择actual_date < 2000/01/01actual_date > SystemDate(或更确切地说是CURRENT_DATE())的所有记录。基于此选择,我想计算这种情况下记录的百分比。不幸的是actual_date在数据库中被声明为字符串,所以我需要将它转换为日期。

我在互联网上搜索了不同的解决方案,但其中一些不适用于 BigQuery。原则上,我可能需要接近以下的代码行。然而,我尝试的一切都不起作用。 BigQuery 要么无法识别该函数(例如尝试使用 CONVERT),要么说它无法比较日期。

代码是这样配置的,因为我计算如下:所有记录 - 正确记录(2000/01/01 和 CURRENT_DATE() 之间的日期)除以所有记录。这应该给出错误记录的百分比(日期低于 2000/01/01 和高于 CURRENT_DATE())。 NULL 是一个可接受的值,因此它作为正确的值包含在计算中。

   SELECT
   ROUND ((
   COUNT(1) - 
   (SUM (CASE WHEN (actual_date IS NULL) IS TRUE THEN 1 ELSE 0 END) 
    + 
    SUM (CASE WHEN (CAST actual_date AS DATE) > 2000/01/01) THEN 1 ELSE 0 END)
    +  
    SUM (CASE WHEN (CAST actual_date AS DATE) < CURRENT_DATE() THEN 1 ELSE 0 
    END)))
    * 100 / COUNT(1), 3)
   FROM `project.dataset.datatable`
   WHERE country_code = 'country1'

结果应该是小于 2000/01/01 且高于 CURRENT_DATE() 的实际日期百分比。

【问题讨论】:

【参考方案1】:

[how to] 将 mm/yyyy 日期与特定日期和 CURRENT_DATE 进行比较

您应该首先将字符串中的日期解析为PARSE_DATE('%m/%Y', '11/2018') - 注意:简单的 CAST 因为 DATE 在这里不适用 然后您可以与其他日期进行比较,例如

PARSE_DATE('%m/%Y', actual_date) BETWEEN '2000-01-01' AND CURRENT_DATE()    

因此,您的最终查询可能如下所示

#standardSQL
SELECT ROUND (
  (COUNT(1) - COUNTIF(PARSE_DATE('%m/%Y', actual_date) BETWEEN '2000-01-01' AND CURRENT_DATE()))
  * 100 / COUNT(1), 3)
FROM `project.dataset.datatable`
WHERE country_code = 'country1'

【讨论】:

以上是关于BigQuery:将 mm/yyyy 日期与特定日期和 CURRENT_DATE 进行比较的主要内容,如果未能解决你的问题,请参考以下文章

dd/mm/yyyy 是啥日期格式?

将日期格式更改为 yyyy-mm-dd

如何将日期转换为“dd/MM/yyyy”格式?

Access 数据库的 .NET 查询将 dd/mm/yyyy 日期文字误解为 mm/dd/yyyy

尝试将开始和结束日期与 mm/yyyy 格式进行比较

日期格式转换