Получить следующий xx: 30 раз (следующая половина прошедшего часа) после указанного времени - PullRequest
1 голос
/ 28 октября 2009

Я пытаюсь найти запрос MySQL, который получит время, следующее за следующей половиной часа от указанной даты / времени. Я имею в виду следующее полчаса, а не полчаса.

Так, например:

  • Если дата-время было "2009-10-27 08:15:24 ", ответ будет "2009-10-27 08:30:00"
  • Если datetime было "2009-10-27 08:49:02", ответ будет "2009-10-27 9:30:00" .

Я столкнулся с этой страницей , которая относится к SQL Server, и к концу этого потока возникла аналогичная проблема. Но это не совсем то же самое, и оно опирается на функцию, которой нет в MySQL.

Вот более полный список примеров и ожидаемых возвращаемых значений:

2009-10-27 08:15:24  should return  2009-10-27 08:30:00
2009-10-27 08:49:02  should return  2009-10-27 09:30:00
2009-10-27 23:49:10  should return  2009-10-28 00:30:00
2009-10-27 10:30:00(.000001)  should return  2009-10-27 11:30:00

(Обратите внимание, что в четвертом примере, поскольку точная половина прошедшего (10: 30: 00.0000000) уже прошла, найдена точка следующей половины прошедшего.)

Я пытался использовать такую ​​вещь:

SELECT IF( (MINUTE(NOW()) < 30), HOUR(NOW()), (HOUR(NOW()) + 1) )

(после которого будет происходить добавление строки CONCATed), но она потерпит неудачу из-за перехода на другой день, и она будет по своей природе «хакерской».

Может кто-нибудь предложить подходящий алгоритм? Я не ожидал бы полного ответа (хотя это было бы хорошо!), Но предложения относительно типа алгоритма были бы полезны. Я рисую листы бумаги уже два часа! У меня есть предположение, что использование модуля может быть полезным, но я недостаточно знаком с ним.

Ответ будет передан в класс PHP позже, но я бы предпочел реализовать его на уровне SQL, если это возможно, поскольку остальная часть запроса также эффективно выполняет другие функции сравнения дат.

Ответы [ 3 ]

2 голосов
/ 28 октября 2009

Это немного грязно, но работает:

select from_unixtime( floor((unix_timestamp(MY_DATE)+(30*60))/(60*60))*(60*60) + (30*60) )

Он сдвигает время вперед на 30 минут, затем усекает его до верхней части часа и добавляет к нему 30 минут. Поскольку он работает с метками времени Unix (секунды с 1970 года), вам не нужно беспокоиться о границах дней, месяцев, лет и т. Д.

0 голосов
/ 28 октября 2009

Используйте функцию MAKETIME (часы, минуты, секунды), чтобы построить желаемое значение.

0 голосов
/ 28 октября 2009

Не могу не заметить, что это будет намного проще на уровне PHP :-) Тем не менее, вот что вы можете сделать:

  1. Добавьте 30 минут к вашей дате, используя DATE_ADD () ; это переместится на следующий час, если уже прошло полчаса
  2. Создайте новое значение даты и времени, извлекая дату / час и жесткое кодирование минут / секунд. CONVERT () , ADDTIME () и MAKETIME () вся помощь.

Конечный результат:

select ADDTIME(
 CONVERT(DATE(DATE_ADD(yourDateTime, INTERVAL 30 MINUTE)), DATETIME), # date part
 MAKETIME(HOUR(DATE_ADD(yourDateTime, INTERVAL 30 MINUTE)), 30, 0) # hour + :30:00
) from ...
...