BigQuery: проверьте, что все даты отформатированы как гггг-мм-дд - PullRequest
1 голос
/ 10 мая 2019

Используя Google BIGQUERY, мне нужно проверить, что значения в столбце birth_day_col имеют правильный и желаемый формат даты: YYYY-MM-DD. Значения в этом столбце определены как STRING. Также значения в этом столбце в настоящее время имеют следующий формат: ГГГГ-ММ-ДД.

Я много исследовал в интернете и нашел интересный обходной путь. Следующий запрос:

SELECT
    DISTINCT birth_day_col
    FROM `project.dataset.datatable`
    WHERE birth_day_col LIKE '[1-2][0-9][0-9][0-9]/[0-1][0-9]/[0-3][0-9]'
    AND country_code = 'country1'

Но результат таков: «Этот запрос не дал результатов.»

Затем я проверил с помощью NOT, используя следующий код:

SELECT
    DISTINCT birth_day_col
    FROM `project.dataset.datatable`
    WHERE NOT(birth_day_col LIKE '[1-2][0-9][0-9][0-9]/[0-1][0-9]/[0-3][0-9]')
    AND country_code = 'country1'

Удивительно, но он дал все значения в birth_dat_col, которые я проверил и которые имеют правильный формат даты, но этот результат может очень сильно совпадать.

И очень странно (неправильно), что я использовал запрос, который должен приводить только к неверному формату дат, но на самом деле он дает мне правильные. Все в этих двух запросах похоже на изменение роли каждого из них.

Ожидаемым результатом любого запроса для этого бизнес-случая является подсчет всех неверно отформатированных дат (даже если в настоящее время это 0).

Спасибо за вашу помощь!

Роберт

Ответы [ 3 ]

1 голос
/ 10 мая 2019

Несколько вещей здесь:

  1. Прочтите документацию для оператора LIKE , если вы хотите понять, как его использовать. Похоже, вы пытаетесь использовать синтаксис регулярного выражения, но оператор LIKE не принимает регулярное выражение в качестве входных данных.
  2. Стандартный формат дат BigQuery - ГГГГ-ММ-ДД, поэтому вы можете просто попробовать выполнить приведение и посмотреть, является ли результат действительной датой, например ::10000
SELECT SAFE_CAST(birth_day_col AS DATE) AS birth_day_col
FROM `project`.dataset.table

Это вернет ноль для любых значений, которые не имеют правильный формат. Если вы хотите найти все из них, которые не имеют правильный формат, вы можете использовать SAFE_CAST внутри фильтра:

SELECT DISTINCT birth_day_col AS invalid_date
FROM `project`.dataset.table
WHERE SAFE_CAST(birth_day_col AS DATE) IS NULL

Результатом этого запроса будут все строки даты, которые не используют формат ГГГГ-ММ-ДД. Если вы хотите проверить наличие слешей, вы можете использовать REGEXP_CONTAINS, например, попробуйте это:

SELECT
  date,
  REGEXP_CONTAINS(date, r'^[0-9]{4}/[0-9]{2}/[0-9]{2}$')
FROM (
  SELECT '2019/05/10' AS date UNION ALL
  SELECT '2019-05-10' UNION ALL
  SELECT '05/10/2019'
)

Если вы хотите найти все даты в формате или ГГГГ-ММ-ДД или в формате ГГГГ / ММ / ДД, вы можете использовать запрос, подобный следующему:

SELECT
  DISTINCT date
FROM `project`.dataset.table
WHERE REGEXP_CONTAINS(date, r'^[0-9]{4}[/\-][0-9]{2}[/\-][0-9]{2}$')

Например:

SELECT
  DISTINCT date
FROM (
  SELECT '2019/05/10' AS date UNION ALL
  SELECT '2019-05-10' UNION ALL
  SELECT '05/10/2019'
)
WHERE REGEXP_CONTAINS(date, r'^[0-9]{4}[/\-][0-9]{2}[/\-][0-9]{2}$')
0 голосов
/ 10 мая 2019

Еще один пример BigQuery Standrad SQL - с использованием SAFE.PARSE_DATE

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '1980/08/10' AS birth_day_col UNION ALL
  SELECT '1980-08-10' UNION ALL
  SELECT '08/10/1980'
)
SELECT birth_day_col
FROM `project.dataset.table`
WHERE SAFE.PARSE_DATE('%Y-%m-%d', birth_day_col) IS NULL   

с результатом списка всех дат, которые не отформатированы как гггг-мм-дд

Row birth_day_col    
1   1980/08/10   
2   08/10/1980   
0 голосов
/ 10 мая 2019

Оператор Google BigQuery LIKE не поддерживает сопоставление цифр и не использует символ [ в своем синтаксисе (я не думаю, что стандартный ISO ISO тоже - LIKE далеко не рядомтакой же мощный, как и Regex).

X [NOT] LIKE Y

Проверяет, соответствует ли STRING в первом операнде X шаблон, заданный вторым операндом Y.Выражения могут содержать следующие символы:

  • Знак процента "%" соответствует любому количеству символов или байтов
  • Знак подчеркивания "_" соответствует одному символу или байту
  • Вы можете выбрать "\", "_" или "%", используя две обратные косые черты.Например, "\%".Если вы используете необработанные строки, требуется только одна обратная косая черта.Например, r "\%".

Вместо этого следует использовать REGEX_CONTAINS.

Я отмечаю, что тесты формата строки не сообщат вам, если датадействительный или нет, однако.Учтите, что 2019-02-31 имеет допустимый формат даты, но неверное значение даты.Я предлагаю вместо этого использовать функцию преобразования типов данных (для преобразования STRING в DATE значение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...