Метка времени MySQL 30 дней с момента создания - PullRequest
0 голосов
/ 11 сентября 2018

Здесь я пытаюсь добавить 30 DAYS к timestamp, когда ключ сеанса был создан.

SELECT * FROM `sessions` 
WHERE (`timestamp` + INTERVAL 30 DAY) <= UTC_TIMESTAMP()

, а затем проверить его на текущее время.


Но это не работает, потому что сеанс был создан всего несколько дней назад.Таким образом, timestamp намного больше, чем UTC_TIMESTAMP (текущее время).

Я могу ДОБАВИТЬ другое условие AND (timestamp + INTERVAL 30 DAY) >= UTC_TIMESTAMP(), но мне придется снова вычислять интервал.


Есть ли более эффективный способ сделать это?

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Попробуйте вместо этого:

`timestamp` >= DATE_SUB(NOW(), INTERVAL 30 DAY)
0 голосов
/ 11 сентября 2018

Если сеанс действителен в течение 30 дней с момента его создания, и вы хотите выбрать только действительные сеансы, вам необходимо убедиться, что создание прошло, но не прошло более 30 дней.

SELECT *
       FROM seeions
       WHERE timestamp < utc_timestamp()
             AND timestamp >= utc_timestamp() - INTERVAL 30 DAY;
0 голосов
/ 11 сентября 2018

Я не совсем уверен в логике, которую вы ищете, но что касается "более эффективного способа":

ваше исходное состояние: (timestamp + INTERVAL 30 DAY) <= UTC_TIMESTAMP()

обычно лучшеобрабатывается как: timestamp <= (UTC_TIMESTAMP() - INTERVAL 30 DAY)

В вашем оригинале MySQL будет применять добавление интервала к значению timestamp каждой строки (и в конечном итоге игнорирует любые индексы, если они у вас есть);в предоставленной мною переписке интервал должен быть вычтен только один раз из результата UTC_TIMESTAMP (), и использование индексации на timestamp все еще является опцией.

Сводка: по возможности применяйте вычисления кстороны условий / сравнений, которые не зависят от данных строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...