BigQuery: Сравните мм / гггг дату с конкретной датой и CURRENT_DATE - PullRequest
1 голос
/ 21 мая 2019

У меня есть даты, отформатированные как mm/yyyy (например, 11/2018) в столбце с именем actual_date.Мне нужно выбрать все записи, где actual_date < 2000/01/01 и actual_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 `project.dataset.datatable`
   WHERE country_code = 'country1'

Результат должен быть% от фактического_даты меньше 2000/01/01 и выше CURRENT_DATE ().

1 Ответ

1 голос
/ 18 июля 2019

[как] Сравнивать мм / гггг дату с конкретной датой и 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...