Size: a a a

2021 July 02

NI

Nickolay Ihalainen in ru_mysql
в 5.6 проще стало, что gtid появились
источник

II

Ivan Ivanov in ru_mysql
Подскажите, импортирую csv  в mysql, данные таблицы отображаются в иероглифах.
На что требует обратить внимание?
источник

NI

Nickolay Ihalainen in ru_mysql
character set database, --default-character-set параметр для mysql cli
источник

NI

Nickolay Ihalainen in ru_mysql
ну и CHARACTER SET ещё есть у load data infile
источник
2021 July 03

AT

Andriy Transkyy in ru_mysql
Приветствую, вот есть таблица и в ней даты:
1  2021-06-25
2  2021-06-28
3  2021-06-30
4  2021-07-01
5  2021-07-02
6  2021-07-02
7  2021-07-03

Как найти количество дней в непрерывном периоде?
например в этом случае
с 2021-06-30 по 2021-07-03 = 4 дня
Будк благодарен за любые советы и рекомендации.
источник

NI

Nickolay Ihalainen in ru_mysql
mysql> select count(distinct d) from test.t WHERE d BETWEEN '2021-06-30' and '2021-07-03';
+-------------------+
| count(distinct d) |
+-------------------+
|                 4 |
+-------------------+
1 row in set (0.00 sec)
источник

AT

Andriy Transkyy in ru_mysql
спасибо, но для этого и необходимо узнать начальную дату периода, т.е. узнать что начало периода 2021-06-30
источник

NI

Nickolay Ihalainen in ru_mysql
как определяется период?
источник

AT

Andriy Transkyy in ru_mysql
его необходимо узнать, т.е. сейчас период с 2021-06-30 по 2021-07-03.
Если бы была дата 2021-06-29 то период был бы с 2021-06-28 по 2021-07-03
т.е. узнать последний не прерывающийся период
источник

NI

Nickolay Ihalainen in ru_mysql
начало периода:
mysql> select id,d, DATE_SUB(d, interval 1 day) > IFNULL(LAG(d) OVER (ORDER BY d),'1000-01-01') is_period_start  from t;
+----+------------+-----------------+
| id | d          | is_period_start |
+----+------------+-----------------+
|  1 | 2021-06-25 |               1 |
|  2 | 2021-06-28 |               1 |
|  3 | 2021-06-30 |               1 |
|  4 | 2021-07-01 |               0 |
|  5 | 2021-07-02 |               0 |
|  6 | 2021-07-02 |               0 |
|  7 | 2021-07-03 |               0 |
+----+------------+-----------------+
7 rows in set (0.00 sec)
источник

AT

Andriy Transkyy in ru_mysql
Благодарю. OVER() это в 8ке появилось?
источник

NI

Nickolay Ihalainen in ru_mysql
create table x select id,d, DATE_SUB(d, interval 1 day) > IFNULL(LAG(d) OVER (ORDER BY d),'1000-01-01') is_period_start, DATE_ADD(d, interval 1 day) < IFNULL(LAG(d) OVER (ORDER BY d DESC),'9999-12-31') is_period_end  from t order by id;
mysql> SELECT MIN(d),COUNT(distinct d) FROM (select d, (SELECT d FROM x x1 WHERE x.d >= x1.d and x1.is_period_start=1 ORDER BY d desc LIMIT 1) start_date from x) a GROUP BY start_date;
+------------+-------------------+
| MIN(d)     | COUNT(distinct d) |
+------------+-------------------+
| 2021-06-25 |                 1 |
| 2021-06-28 |                 1 |
| 2021-06-30 |                 4 |
| 2021-07-05 |                 1 |
+------------+-------------------+
4 rows in set (0.00 sec)
источник

NI

Nickolay Ihalainen in ru_mysql
да, в восьмёрке
источник

NI

Nickolay Ihalainen in ru_mysql
можно упрощать, т.к. фактически не нужно знать конец периода, достаточно знать что сейчас начало периода или не начало.
источник

NI

Nickolay Ihalainen in ru_mysql
итого временная табличка упрощается до:
create table x select id,d, DATE_SUB(d, interval 1 day) > IFNULL(LAG(d) OVER (ORDER BY d),'1000-01-01') is_period_start from t order by id;
источник

NI

Nickolay Ihalainen in ru_mysql
можно без WINDOW, но тогда или джойны будут сложные или извращаться с user variables
источник

AT

Andriy Transkyy in ru_mysql
Спасибо большое, буду разбираться)
источник

NI

Nickolay Ihalainen in ru_mysql
на табличке x нужен индекс alter table x add key(d,is_period_start); если строчек много
источник

AT

Andriy Transkyy in ru_mysql
еще вопрос:  interval 1 day
А если промежуток будет больше, чем 1 день?
источник

NI

Nickolay Ihalainen in ru_mysql
неважно сколько дней промежуток, interval 1 day это проверка на непрерывность: день_перед_текущим  > дня предыдушей строчки?  если равен, тогда непрерывный период, если больше и не важно на сколько дней, тогда начало периода
источник