Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Как вычитать дату?


Автор: dm9 27.12.2005, 16:28
Есть столбец с типом DATETIME или TIMESTAMP(14).

Надо найти все строки, в которых данная отметка времени - не ранее, чем за 12 минут до NOW().

Под 4.0.25 всё прекрасно работало таким образом:
Код

WHERE NOW() - '00000000001200' > lastrequest

и таким тоже
Код

WHERE NOW() - '0000-00-00 00:12:00' > lastrequest


Под 4.1.14 это не работает.

Вопрос - как же правильно найти расстояние между датами.

Хранить дату как int - не предлагать.

Автор: Akina 27.12.2005, 16:50
SubTime, TimeDiff... мануалы-то читаем?

Автор: dm9 27.12.2005, 17:18
Akina, а можно мне, как ОЧЕНЬ большому тормозу, примерчик на тему

Цитата(dm9 @ 27.12.2005, 17:28)
Надо найти все строки, в которых данная отметка времени - не ранее, чем за 12 минут до NOW().


?

Автор: Illuminaty 28.12.2005, 00:35
Попробуй так
Код

WHERE MINUTE (NOW( )) - MINUTE (`lastrequest`) >12

`lastrequest` - это же поле для хранения времени у тебя?
ЗЫ У меня на MySQL 4.1.8 работает.

Автор: sergejzr 28.12.2005, 00:47
Если PHP то ябы сделал:

Код

$diff = time() - (12*60)


Ну и потом
Код

WHERE {$diff} > lastrequest

Автор: Illuminaty 28.12.2005, 00:48
А лучше так сделать
Код

WHERE MINUTE (NOW( ) - `lastrequest`) >12

доплнительно можно посмотреть http://dev.mysql.com/doc/refman/4.0/ru/date-and-time-functions.html

Автор: Illuminaty 28.12.2005, 00:59
Цитата(sergej @ 28.12.2005, 00:47)
Код

$diff = time() - 12

sergej.z, при всем уважении, но этот код не то что надо
Код

time() - 12
вернет время 12 секунд назад, а не минут.
Код

time() - 12*60
более похоже на правду

Автор: sergejzr 28.12.2005, 01:01
Да я уже иправил. Неправильно прочитал условие, показалось 12 сек.

Автор: dm9 28.12.2005, 12:40
Тестируем.

Первый вариант.
Цитата(Illuminaty @ 28.12.2005, 01:35)
WHERE MINUTE (NOW( )) - MINUTE (`lastrequest`) >12


Путь будет не NOW(), а другой столбец. Назовём его r9.

Код

SELECT r9, lastrequest, MINUTE (r9) - MINUTE (lastrequest) AS result FROM chat_users


r9 = '2006-12-27 16:00:00'
lastrequest = '2006-12-27 15:59:57'
result = '-59'

Далеко от требуемого результата, не так ли?

Второй вариант.
Цитата(Illuminaty @ 28.12.2005, 01:48)
WHERE MINUTE (NOW( ) - `lastrequest`) >12


Код

SELECT r9, lastrequest, MINUTE (r9 - lastrequest) AS result FROM chat_users


r9 = '2006-12-27 16:00:00'
lastrequest = '2006-12-27 15:59:57'
result = '40'


Цитата(sergej @ 28.12.2005, 01:47)
Если PHP то ябы сделал:


Сергей, очень хотелось бы сделать это средствами СУБД. Иначе получается некрасиво как-то. Но пусть даже будет так. Что возвращает time()? Он возвращает не TIMESTAMP, он возвращает число секунд от начала эпохи. А TIMESTAMP - это число в формате 20051228000000 - то есть это не секунды. Твой код работать не будет тоже.

Автор: Illuminaty 28.12.2005, 13:18
попробуй так
Код

SELECT r9, lastrequest
FROM ttt
where DATE_ADD(
lastrequest,  INTERVAL 12 MINUTE) > r9

а в предыдущих ответах я свою ошибку понялsmile

Автор: dm9 28.12.2005, 14:37
Хм. Да, это будет работать для фиксированного числа минут/секунд, спасибо.

Но что, если эти "12 минут" у меня хранятся в другом столбце БД в формате '0000-00-00 00:12:00'? Насколько я понял, ADDDATE() такого не поддерживает. Это вообще возможно под MySQL 4.1? Под 4.0.25 всё работало smile

Добавлено @ 14:36
Я, кажется, понял. Формат `0000-00-00 00:12:00` считается некорректным.

"12 минут" буду хранить в БД как строковое поле interv в формате 'DAYS HOURS:MINUTES', а затем делать так:

WHERE DATE_ADD(lastrequest, INTERVAL interv DAY_MINUTE) > r9

Наверное, это решение задачи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)