SELECT ctz
FROM (
SELECT shecdule.*,
CONVERT_TZ(
if(timestamp_start > last_update, timestamp_start, last_update),
'GMT',
user.timezone
) AS ctz
FROM shecdule
INNER JOIN
user
ON user.user_id = s.user_id
) s
WHERE ctz < CURRENT_TIMESTAMP()
Обратите внимание, что в этом запросе не используются индексы timestamp_start
и last_update
.
Подробнее о производительности смотрите в статье в моем блоге:
В двух словах вам лучше использовать это:
SELECT ctz
FROM (
SELECT shecdule.*,
CONVERT_TZ(
if(timestamp_start > last_update, timestamp_start, last_update),
'GMT',
user.timezone
) AS ctz
FROM shecdule
INNER JOIN
user
ON user.user_id = s.user_id
WHERE timestamp_start < CURRENT_TIMESTAMP() + INTERVAL 14 HOUR
OR last_update < CURRENT_TIMESTAMP() + INTERVAL 14 HOUR
) s
WHERE ctz < CURRENT_TIMESTAMP()
Этот внутренний запрос будет выполнять грубую фильтрацию для timestamp_start
и last_update
с использованием индексов (никакое преобразование зоны не может сместить время, превышающее +14:00
часов с UTC
).
Внешний подзапрос затем отфильтрует результаты по часовому поясу пользователя.
Если вам не нравятся подзапросы, вы также можете использовать:
SELECT shecdule.*,
CONVERT_TZ(
if(timestamp_start > last_update, timestamp_start, last_update),
'GMT',
user.timezone
) AS ctz
FROM shecdule
INNER JOIN
user
ON user.user_id = s.user_id
/*
WHERE timestamp_start < CURRENT_TIMESTAMP() + INTERVAL 14 HOUR
OR last_update < CURRENT_TIMESTAMP() + INTERVAL 14 HOUR
*/
HAVING ctz < CURRENT_TIMESTAMP()