Теория
transactions

Операторы и функции для работы с датами

Бизнес-процессы тесно увязаны со временем.
Например, чтобы оценить влияние погоды на покупательскую активность в интернет-магазине, важно знать, когда пользователь совершил покупку и какая погода была в тот момент. Нужно уметь соединять данные о времени из разных источников и группировать информацию по месяцу, дню или часу.
Две основные функции для работы со временем и датой — EXTRACT (англ. «извлекать») и DATE_TRUNC (от англ. truncate date, «усекать, отбрасывать дату»). Обе функции вызывают в блоке SELECT.
Шаблон функции EXTRACT:
Скопировать кодSQL
SELECT EXTRACT(часть_даты FROM столбец) AS новый_столбец_с_датой FROM Таблица_со_всеми_датами;
Название функции определяет её суть. EXTRACT извлекает из даты нужную часть: год, месяц, минуту. Что ещё можно получить вызовом EXTRACT:
  • century — век;
  • day — день;
  • doy (от англ. day of the year) — день года: от 1 до 365/366;
  • isodow (от англ. day of the week и ISO 8601, международного стандарта даты и времени) — день недели: понедельник — 1, воскресенье — 7.
  • hour — час;
  • milliseconds — миллисекунда;
  • minute — минута;
  • second — секунда;
  • month — месяц;
  • quarter — квартал;
  • week — неделя в году;
  • year — год.
Вызовем функцию EXTRACT и получим из поля log_on таблицы user_activity (англ. «активность пользователей») два столбца — с месяцем и днём входа определённого пользователя в личный кабинет:
id_userlog_onlog_off
62019-03-01 23:34:552019-04-01 01:20:45
1562019-07-03 17:59:212019-07-03 19:31:34
652019-03-25 14:30:462019-03-25 17:47:53
Скопировать кодSQL
SELECT id_user, EXTRACT(MONTH FROM log_on) AS month_activity, EXTRACT(DAY FROM log_on) AS day_activity FROM user_activity;
user_activitymonth_activityday_activity
631
15673
65325
Пользователь под номером 6 входил в личный кабинет первого числа третьего месяца. А 156-ой пользователь — третьего числа седьмого месяца.
DATE_TRUNC усекает дату до часа, дня или месяца. В отличие от EXTRACT часть, до которой нужно усечь дату, записывают как строку. А столбец, откуда берут данные о времени, указывают через запятую:
Скопировать кодSQL
SELECT DATE_TRUNC('часть_даты_до_которой_усекаем', столбец) AS новый_столбец_с_датой FROM Таблица_со_всеми_датами;
Часть даты, до которой данные нужно «обнулить», указывают в аргументе функции DATE_TRUNC:
  • 'microseconds' — микросекунды;
  • 'milliseconds' — миллисекунды;
  • 'second' — секунда;
  • 'minute' — минута;
  • 'hour' — час;
  • 'day' — день;
  • 'week' — неделя;
  • 'month' — месяц;
  • 'quarter' — квартал;
  • 'year' — год;
  • 'decade' — декада года;
  • 'century' — век.
Знать точное время активности пользователя бывает важно. Однако, если нужно сгруппировать данные по дате и часу входа, минуты и секунды портят картину. Усечём значения поля log_on до часов.
Скопировать кодSQL
SELECT DATE_TRUNC('hour',log_on) as date_log_on FROM user_activity;
Скопировать кодSQL
date_log_on 2019-03-01 23:00:00 2019-07-03 17:00:00 2019-03-25 14:00:00
Задача   1 / 4
1.
Получите часы из поля date таблицы transactions. Назовите новое поле hours.
Подсказка
Примените функцию EXTRACT. В аргументе функции укажите hour.
2.
Получите часы из поля date таблицы transactions. Назовите новое поле hours. Посчитайте с группировкой по полю hours, сколько товаров (id_product) было куплено. Назовите результирующую переменную cnt.
Результат отсортируйте по возрастанию поля hours.
Подсказка
Вызовите EXTRACT, чтобы получить часы из столбца date. Агрегирующей функцией COUNT() подсчитайте количество продуктов. Сгруппируйте и отсортируйте данные по полю hours.
3.
Получите день из столбца date таблицы transactions. Назовите новое поле days. Подсчитайте c группировкой по дням количество купленных товаров (id_product) и назовите получившееся поле cnt. Отсортируйте результат в порядке возрастания даты.
Подсказка
Вызовите EXTRACT, чтобы получить часы из столбца date. Агрегирующей функцией COUNT() подсчитайте количество продуктов. Сгруппируйте и отсортируйте данные по полю days.
4.
Вы узнали, что 1 числа было куплено больше всего товаров. Усеките дату из поля date до дня и назовите её date_month. Найдите количество купленных в этот день продуктов (id_product), сгруппируйте по полю date_month и сохраните его в переменнойcnt. Отсортируйте результат по возрастанию date_month.
Подсказка
Усеките дату функцией DATE_TRUNC. Первым аргументом передайте строку 'day'. Вторым — поле date.
user_idid_transactionid_storeid_productdateunique_id
3262581521442019-06-14 16:27:300
3262581521172019-06-14 16:27:301
3262581521052019-06-14 16:27:302
3262581521112019-06-14 16:27:303
3262581521382019-06-14 16:27:304
542258163742019-06-10 14:16:105
542258163962019-06-10 14:16:106
54225816342019-06-10 14:16:107
525258172272019-06-26 14:11:098
525258172472019-06-26 14:11:099
5252581721722019-06-26 14:11:0910
609258184742019-06-04 13:00:4311
609258184602019-06-04 13:00:4312
6092581841012019-06-04 13:00:4313
6092581841772019-06-04 13:00:4314
6092581841652019-06-04 13:00:4315
7632581901262019-06-23 19:04:3016
987258202612019-06-21 09:44:4517
9872582021242019-06-21 09:44:4518
640258212542019-06-04 18:32:2419
15525822342019-06-28 19:59:2220
15525822312019-06-28 19:59:2221
155258223882019-06-28 19:59:2222
155258223192019-06-28 19:59:2223
3542582311202019-06-07 15:50:1524
354258231822019-06-07 15:50:1525
3542582311352019-06-07 15:50:1526
250258242642019-06-03 10:25:4427
412582511792019-06-20 19:26:5128
41258251492019-06-20 19:26:5129
412582511752019-06-20 19:26:5130
412582511202019-06-20 19:26:5131
719258263152019-06-04 14:51:4732
719258263372019-06-04 14:51:4733
719258263752019-06-04 14:51:4734
7192582631382019-06-04 14:51:4735
738258273102019-06-26 20:09:4936
7382582731202019-06-26 20:09:4937
6802582841532019-07-01 17:33:0438
6802582841192019-07-01 17:33:0439
6802582841712019-07-01 17:33:0440
6802582841722019-07-01 17:33:0441
482582911352019-06-07 10:03:2542
48258291732019-06-07 10:03:2543
856258314302019-06-22 10:15:1048
856258314452019-06-22 10:15:1049
856258314472019-06-22 10:15:1050
8562583141142019-06-22 10:15:1051
8562583141782019-06-22 10:15:1052
650258320592019-06-18 15:02:5353
650258320212019-06-18 15:02:5354
650258320412019-06-18 15:02:5355
6502583201432019-06-18 15:02:5356
42258331172019-07-01 21:30:3557
42258331772019-07-01 21:30:3558
48258343382019-06-07 20:50:5059
2152583541782019-06-26 21:44:2360
2152583541612019-06-26 21:44:2361
215258354832019-06-26 21:44:2362
215258354262019-06-26 21:44:2363
9432583601492019-06-09 22:35:4764
94325836032019-06-09 22:35:4765
507258374172019-06-18 10:51:1666
507258374232019-06-18 10:51:1667
47258381782019-06-28 22:16:0468
6942583931202019-06-01 15:13:5069
694258393142019-06-01 15:13:5070
694258393432019-06-01 15:13:5071
510258402262019-06-30 17:46:1572
5102584021542019-06-30 17:46:1573
5102584021052019-06-30 17:46:1574
5102584021912019-06-30 17:46:1575
8962584101632019-06-24 15:17:1376
896258410582019-06-24 15:17:1377
896258410642019-06-24 15:17:1378
796258433742019-06-25 21:17:4383
859258442722019-06-10 14:28:3784
8592584421682019-06-10 14:28:3785
8592584421122019-06-10 14:28:3786
317258450102019-06-30 17:56:3287
317258450632019-06-30 17:56:3288
317258450182019-06-30 17:56:3289
3172584501202019-06-30 17:56:3290
317258450352019-06-30 17:56:3291
475258464402019-06-21 17:33:2992
4752584641002019-06-21 17:33:2993
867258472632019-06-05 23:53:4494
535258484782019-06-20 17:19:2695
5352584841092019-06-20 17:19:2696
535258484252019-06-20 17:19:2697
5352584841682019-06-20 17:19:2698
5602584921142019-06-04 13:39:2299
5602584921542019-06-04 13:39:22100
560258492222019-06-04 13:39:22101
5602584921122019-06-04 13:39:22102
560258492362019-06-04 13:39:22103
637258501292019-06-11 16:41:18104
6372585011012019-06-11 16:41:18105
6372585011022019-06-11 16:41:18106
178258514412019-06-18 15:55:25107
Код
Результат