#mysql
Вопрос:
Поскольку функции date_trunc нет в mysql, что мы можем использовать в этом коде:
Select date_trunc(‘week’, b.occured_at),
count(distinct b.user_id) as users_active
from events b
where b.event_type = ‘engagement’
and b.event_type = ‘login’
group by 1
order by 1;
и в
select date_trunc('day', created_at) as days,
count(*) as users,
count( case
when activated_at is not null then u.user_id
else null
end ) as active_users
from users u
where created_at >='2013-05-01' and created_at <= '2013-05-31'
group by 1
order by 1;
Комментарии:
1. Что именно это
date_trunc()
такое и что именно оно должно делать?2. извлеките некоторые условия даты из данного времени @user207421
Ответ №1:
Хорошо, так что, поскольку вы говорите о Day
amp; Week
точности, временной аспект этого становится неуместным. Поэтому вероятное решение, которое приходит мне на ум, заключается в том, что вы используете DATE_FORMAT
динамическое получение только части даты и сохраняете часть времени статичной. Позвольте мне показать вам, как вы можете сделать то же самое на примере ниже:
Схема базы данных
CREATE TABLE rental
(
rent_id INT NOT NULL,
customer_id INT NOT NULL,
checkin_date TIMESTAMP,
employee_id INT,
checkout_date TIMESTAMP
);
INSERT INTO rental (rent_id,customer_id,checkin_date,employee_id,checkout_date)
VALUES
(1,5382,'2021-09-10 22:10:34',1,'2021-09-18 10:10:48'),
(2,5383,'2019-01-25 19:06:52',1,'2019-01-26 07:06:52'),
(3,5384,'2019-01-26 16:06:34',2,'2019-01-27 04:06:33');
Итак, теперь я хочу запросить checkout_date
данные с точностью до дня и недели.
Решение
SELECT
rent_id,
WEEKDAY(checkout_date) as weekday,
DATE_FORMAT(checkout_date, '%Y-%m-%dT00:00:00.000Z') as day_precision,
DATE_FORMAT(SUBDATE(checkout_date, WEEKDAY(checkout_date)), '%Y-%m-%dT00:00:00.000Z') as week_precision
FROM rental;
Выход
rent_id | будний день | day_precision | недельная точность |
---|---|---|---|
1 | 5 | 2021-09-18T00:00:00.000 Z | 2021-09-13T00:00:00.000 Z |
2 | 5 | 2019-01-26T00:00:00.000 Z | 2019-01-21T00:00:00.000 Z |
3 | 6 | 2019-01-27T00:00:00.000 Z | 2019-01-21T00:00:00.000 Z |
Объяснение
DATE_FORMAT(checkout_date, '%Y-%m-%dT00:00:00.000Z') as day_precision
Здесь мы просто заполняем часть даты из базы данных и говорим
MySQL
, чтобы остальная часть времени оставалась статичной, так как точность дня на самом деле не заботится о времени.
DATE_FORMAT(SUBDATE(checkout_date, WEEKDAY(checkout_date)), '%Y-%m-%dT00:00:00.000Z') as week_precision
Здесь мы просто выясняем, как далеко текущий день находится от начала недели, а затем вычитаем это количество дней из даты, чтобы получить дату, которая указывает на начало недели. Затем эта дата форматируется в соответствии с преимуществами.
Ответ на вашу проблему
-- 1st Query
Select DATE_FORMAT(SUBDATE(b.occured_at, WEEKDAY(b.occured_at)), '%Y-%m-%dT00:00:00.000Z') as week_precision,
count(distinct b.user_id) as users_active
from events b
where b.event_type = ‘engagement’
and b.event_type = ‘login’
group by 1
order by 1;
-- 2nd Query
select DATE_FORMAT(created_at, '%Y-%m-%dT00:00:00.000Z') as day_precision,
count(*) as users,
count( case
when activated_at is not null then u.user_id
else null
end ) as active_users
from users u
where created_at >='2013-05-01' and created_at <= '2013-05-31'
group by 1
order by 1;
Демонстрация DbFiddle
Тем не менее, вы также можете поиграть и сравнить результаты MySQL
amp; PostGreSQL
для себя здесь. Я сохранил оба запроса, чтобы вы могли переключить серверы БД в левом верхнем углу, чтобы проверить и сравнить результаты.
Комментарии:
1. Огромное спасибо 🙂 Спасибо за ваше драгоценное время.
2. Озвучьте ответ, если сможете, чтобы это помогло мне дать больше ответов сообществу в будущем.