Сосредоточение внимания на наиболее важных концепциях для специалистов по данным

Что делает хорошего SQL-кодировщика, так это способность манипулировать данными любым способом, который им нравится - большая часть этого - возможность манипулировать датами. Даты чрезвычайно важны, потому что компании любят сравнивать и оценивать эффективность бизнеса в разные периоды времени. Следовательно, возможность манипулировать датами имеет важное значение для бизнес-операций высшего уровня и бизнес-отчетности.

В этой статье мы рассмотрим 5 наиболее важных и наиболее полезных функций DATE в SQL, а также некоторые практические бизнес-кейсы, в которых они могут быть использованы.

1. DATE_TRUNC ()

Синтаксис:

DATE_TRUNC(date_expression, date_part)

Что оно делает?

DATE_TRUNC () сокращает дату до указанной части даты.

В приведенном ниже примере, поскольку мы указали date_part = MONTH, date_trunc () усечет дату, чтобы получить первый день месяца:

DATE_TRUNC('2021-06-28', MONTH) = '2021-06-01'

Другой пример: если мы укажем date_part = YEAR, то получим первый день года указанной даты:

DATE_TRUNC('2021-06-28', YEAR) = '2021-01-01'

Когда это полезно?

  • DATE_TRUNC чрезвычайно полезен, когда вы хотите агрегировать числа на периодической основе, например, еженедельно, ежемесячно или ежегодно.
  • DATE_TRUNC необходим при проведении когортного анализа, когда вы обычно группируете пользователей по месяцам.

Примеры)

Пример 1: Предположим, вы хотите получить сумму продаж за неделю из приведенной ниже таблицы:

with sales_data as (
    SELECT DATE_TRUNC(date, WEEK) as week_date,
           daily_sales
    FROM sales
)
SELECT week_date,
       SUM(daily_sales) as weekly_sales
FROM sales_data
GROUP BY week_date

2. DATE_DIFF ()

Синтаксис:

DATE_DIFF(date_expression_1, date_expression_2, date_part)

Что оно делает?

DATE_DIFF () сравнивает две даты и возвращает разницу в части даты между двумя датами.

Например, если date_part = DAY, то DATE_DIFF () возвращает количество ДНЕЙ между двумя датами. Если date_part = MONTH, то DATE_DIFF () возвращает количество месяцев между двумя датами.

DATE_DIFF('2021-01-02', '2021-01-01', DAY) = 1

Когда это полезно?

  • DATE_DIFF () полезен, когда вы хотите сравнить две даты, например, когда пакет был отправлен и когда пакет был доставлен, или когда пользователь зарегистрировался и когда они были отменены.
  • DATE_DIFF () также полезен в предложении WHERE, если вы хотите отфильтровать даты, которые произошли X периодов назад (например, 5 дней назад, 2 недели назад, последний месяц).

Примеры)

Пример 1: Предположим, вы хотите узнать время между отправкой пакета и доставкой пакета:

SELECT order_id
     , DATE_DIFF(date_received, date_shipped, DAY) as shipping_time
FROM orders

Пример 2: Используя ту же таблицу выше, предположим, что вы хотите получить все заказы, время доставки которых составляет менее 10 дней:

SELECT order_id
     , amount
FROM orders
WHERE DATE_DIFF(date_received, date_shipped, DAY) < 10

3. DATE_ADD () / DATE_SUB ()

Синтаксис:

DATE_ADD(date_expression, INTERVAL int64 date_part)
DATE_SUB(date_expression, INTERVAL int64 date_part)

Что оно делает?

DATE_ADD () добавляет к дате указанное количество частей даты. И наоборот, DATE_SUB вычитает указанное количество частей даты из даты.

DATE_ADD('2021-01-01', INTERVAL 3 DAY) = '2021-01-04'
DATE_SUB('2021-01-04', INTERVAL 3 DAY) = '2021-01-01'
DATE_ADD('2021-01-01', INTERVAL 1 MONTH) = '2021-02-01'

Когда это полезно?

  • DATE_ADD () и DATE_SUB () могут использоваться аналогично, как DATE_DIFF () в предложении WHERE, для фильтрации дат, которые произошли X периодов назад или X периодов в будущем.

Примеры):

Пример 1: Предположим, вы хотите получить все заказы, время доставки которых составляет менее 10 дней:

SELECT order_id
     , amount
FROM orders
WHERE DATE_ADD(date_shipped, INTERVAL 10 DAY) > date_received

4. ВЫПИСКА ()

Синтаксис:

EXTRACT(part FROM date_expression)

Что оно делает?

EXTRACT () возвращает значение, соответствующее указанной части даты.

EXTRACT(DAY FROM '2021-01-03') = 3
EXTRACT(MONTH FROM '2021-01-03') = 1
EXTRACT(YEAR FROM '2021-01-03') = 2021

Когда это полезно?

  • Использование EXTRACT () - это простой способ получить определенные компоненты даты, которые вас интересуют.
  • Например, если ваша компания составляет отчеты по номерам недель, вы можете использовать EXTRACT (), чтобы получить номер недели на заданную дату для данной записи.
  • EXTRACT () позволяет получить номер месяца или год от даты, которые можно использовать в качестве функций для модели машинного обучения.

5. CURRENT_DATE ()

Синтаксис:

CURRENT_DATE([time_zone])

Что оно делает?

CURRENT_DATE () возвращает текущую дату выполнения запроса в указанном часовом поясе. Обратите внимание, что параметр часового пояса является необязательным и указывать его не нужно.

Когда это полезно?

  • Использование CURRENT_DATE () - это более простой способ ссылки на сегодняшнюю дату в отличие от жестко заданной даты, что особенно полезно, если это запрос, запланированный на Airflow, или запрос, который вы часто используете.

Примеры):

Пример 1: Предположим, вы хотите получить все заказы, которые были отправлены за последнюю неделю:

SELECT order_id
     , amount
FROM orders
WHERE DATE_DIFF(CURRENT_DATE(), date_shipped, DAY) < 7

Пример 2: Предположим, вы хотите получить все заказы за любой год, которые были отправлены в том же месяце, что и сегодня:

SELECT order_id
     , amount
FROM orders
WHERE EXTRACT(MONTH FROM date_shipped) = EXTRACT(MONTH FROM CURRENT_DATE())

Спасибо за прочтение!

Теперь, когда вы понимаете, как работают пять основных функций DATE в SQL, пора проверить свои знания. Я предоставлю два ресурса:

  1. Leetcode - это веб-сайт, на котором есть сотни проблем с кодированием, которые вы можете решить. Одна проблема под названием Повышение температуры - это хорошая проблема, которая бросает вызов вашей способности работать с финиками.
  2. w3resource - еще один отличный ресурс - в этой ссылке 21 проблема, связанная с datetime.

Как всегда, я желаю вам удачи в учебе!

Не знаете, что читать дальше? Я подобрала для вас другую статью:



и еще один!



Теренс Шин