Какова альтернатива date_trunc в mysql?

#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. Озвучьте ответ, если сможете, чтобы это помогло мне дать больше ответов сообществу в будущем.