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

时间:2019-05-21 13:38:15

标签: sql google-bigquery

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

我在互联网上搜索了不同的解决方案,但是其中一些不适用于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 `irn-70545-dev.reporting.A3CT_CDM_COMMON_GDPR`
   WHERE ref_country_cd = 'ITA'

结果应为实际日期的%,小于2000/01/01且大于CURRENT_DATE()。

1 个答案:

答案 0 :(得分:1)

  

[如何]比较mm / yyyy日期与特定日期和CURRENT_DATE

您应该首先将字符串中的日期解析为PARSE_DATE('%m/%Y', '11/2018')-注意:由于DATE无法在此处显示简单的CAST,
然后,您可以与其他日期进行比较,例如

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'