Правильно ли такое оформление запроса? Выводит пустую таблицу при добавлении: HAVING datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR); Или подскажите как отобрать данные за последний час?
sql = """
SELECT STR_TO_DATE(CONCAT(date, time), '%d.%m.%Y%h:%i:%s') AS datetime,
last,
vol,
oper
FROM all_trades
HAVING datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR);
"""
Пример данных до запроса:
date time last vol oper
0 14.10.2019 10:48:03 132330 1 S
1 14.10.2019 10:00:00 132840 24 B
2 14.10.2019 10:48:03 132330 1 B
3 14.10.2019 10:00:00 132840 1 S
4 14.10.2019 10:00:00 132830 1 S
Пример данных после запроса:
datetime last vol oper
0 2019-10-14 10:48:03 132330 1 S
1 2019-10-14 10:00:00 132840 24 B
2 2019-10-14 10:48:03 132330 1 B
3 2019-10-14 10:00:00 132840 1 S
4 2019-10-14 10:00:00 132830 1 S
DDL таблицы:
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| date | text | YES | | NULL | |
| time | text | YES | | NULL | |
| last | int(11) | YES | | NULL | |
| vol | int(11) | YES | | NULL | |
| oper | varchar(7) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
Полное оформление запроса:
connection = pymysql.connect(host='localhost', user='root', passwd='******', db='quotes')
sql = """
SELECT STR_TO_DATE(CONCAT(date, time), '%d.%m.%Y%h:%i:%s') AS datetime,
last,
vol,
oper
FROM all_trades
HAVING datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR);
"""
df = pd.io.sql.read_sql(sql, connection)
connection.close()
Ваш запрос мягко говоря "не оптимален".
Использую having
, получается что базе данных приходится сначала преобразовать всю вашу таблицу к нужному виду, а потом уже отсекать лишние данные. Если таблица будет более менее большая, то ваш запрос начнет дико тормозить.
Для оптимизации вашего запроса, для начала предлагаю отсечь всё по дате добавив:
WHERE DATE_FORMAT(NOW(), '%d.%m.%Y') = date
Это уже сильно снизит количество обрабатываемых данных.
А чтобы сделать отсчеку по времени, можно использовать сравнение строк:
and DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 HOUR), '%H:%i:%s') < time
Только надо следить, чтобы данные в сравнении точно совпадали по формату.
Единственно, что в этом случае не будет работать переход на новую дату. Но и тут можно что-нибудь придумать не используя having
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Как получить из коллекции по ключю name? Laravel
если есть две записи в таблице, допустим в dating: 1 запись (id=1, user_id=10, user_id_from=14) 2 запись (id=2, user_id=14, user_id_from=10) это значит что у пользователей совпали...
После авторизации в Instagram я получаю access_token но проблема в том что я получаю его в следующем формате: