Проблема с сравнению по времени с mysql


у меня есть проблема: у меня есть таблица времени доставки, времени для каждого периода Ex.: 14:00 às 22:30 срок 40min. Я могу поймать это с помощью SELECT с помощью BETWEEN.

, Когда приходит срок доставки, как Das 22:00 às 02:00 срок 55min SELECT с простого BETWEEN не решение проблемы.

hora_inicio: 22:00
hora_fim: 02:00
tempo: 00:55

Будем считать, что сейчас 23:00, затем становится 23:00 ENTRE 22:00 E 02:00, только это не попадает, потому что 02:00 уже день далее, верно?

инструкцию SQL, используемую в 'легко':

SELECT tempo FROM tempo_entrega WHERE id_restaurante = 12 AND CURTIME() BETWEEN hora_inicio AND hora_fim

Следуя логике @JoaoRaposo смотрите:

id_restaurante:12
hora_inicio: 22:00:00
hora_fim: 02:00:00
tempo: 00:40:00

id_restaurante:12
hora_inicio: 02:30:00
hora_fim: 16:30:00
tempo: 00:25:00

Применил следующую инструкцию (мне кажется, я адаптированы правильно в Mysql, у меня нет знаний IF ELSE в SQL:

SELECT tempo FROM tempo_entrega WHERE id_restaurante = 12 AND CURTIME() BETWEEN hora_inicio AND hora_fim OR  id_restaurante = 12 AND CURTIME() BETWEEN hora_inicio AND '23:59:59' OR id_restaurante = 12 AND CURTIME() BETWEEN '00:00:00' AND hora_fim

И у меня, как возвращение: tempo: 00:25:00

там, все идеально... masss... сколько я включил "CURTIME ()" "23:30:00" возвращение:

tempo: 00:40:00
tempo: 00:25:00

я Полагаю, что тот факт, я использовал-или он взял из двух способов... но с помощью AND вместо OR не возвращает ни один, ни другой. :(

 2
Author: Stedile93, 2014-02-17

2 answers

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

<?php
$agora = date("d-m-Y H:i:s");//EX: 17/02/2014 19:00:24
$agora_em_segundos = strtotime($agora);//EX: 1392660273
// OU
$agora = time();//EX: 1392660273
//Entre dias
$anterior = strtotime('2014-02-16 23:30:00');//EX: 1392589800
$atual = strtotime('2014-02-17 00:25:00');//EX: 1392593100

$calculo = $atual - $anterior;//EX: 3300
$duracao = segundosParaMinutos($calculo); // 55 min

function segundosParaMinutos($seg){
    return (int)$seg / 60;
}

, Начиная с этого примера, вы можете изменить свои таблицы, а затем сохранить в полях hora_dia_inicio и hora_dia_fim в считанные секунды.

 0
Author: byteman, 2014-02-17 18:37:07

Мне кажется, что проблема находится в области моделирования таблице. Теоретически это должно быть что-то вроде:

hora_dia_inicio hora_dia_fim tempo_entrega
              0             2           55
              2            22           40
             22            24           55

И тогда запрос будет выглядеть так:

SELECT tempo_entrega
FROM tempo_entrega
WHERE hora BETWEEN hora_dia_inicio < ? AND hora_dia_fim >= ?;
 0
Author: Rodrigo Rigotti, 2014-02-17 16:08:28