2013-04-18 3 views
0

У меня вопрос MySQL. У меня есть таблица с тремя столбцами: «salesdate» (содержит дату), «salestime» (содержит время) и «остаток» (содержит целое число). Таблица содержит как прошлые, так и будущие даты. Я хочу выбрать значение из «остатка», которое наиболее близко соответствует текущей дате и времени.MySql запросить подмножество

Я построил запрос ниже, но он только выбирает значения, где оба значения даты и времени являются истинными. Это может привести к неправильному результату, поскольку в «salesdate» могут быть строки со вчерашней датой, но все значения «salestime» больше текущего времени, поэтому мой текущий запрос будет игнорировать эти ... даже если они являются ближайшими на текущую дату/время.

Мой текущий запрос:

$result = mysql_query(
"SELECT remaining 
FROM quantity_time 
WHERE salesdate<=CURDATE() 
AND salestime<=CURTIME() 
ORDER BY salesdate DESC 
LIMIT 1 "); 

Я думаю, что мне нужно сделать, это запрос для дат первого, а затем каким-то образом отфильтровать этот список, чтобы показать дату/время, которое ближе всего к текущему времени? но как ? Если вы можете помочь - я искал и не могу найти ясный, шаг за шагом способ сделать это. Ваша помощь очень ценится.

ответ

1

, что ближе всего к текущему времени?

Первая проблема заключается в том, что ваш дизайн данных неправильный. Если время и дата относятся к одному и тому же событию, то информация должна быть представлена ​​одним полем datetime, а не двумя отдельными. В результате любые запросы, которые вы запускаете по этим данным, будут очень неэффективными.

Кроме того, из вашего описания не ясно, будет ли время продаж + время в будущем.

Таким образом, используя текущую схему:

SELECT remaining 
FROM quantity_time 
ORDER BY ABS(NOW() - timestamp(salesdate,salestime)) DESC 
LIMIT 1 

Термин «остальные» подразумевает, что вы используете это, чтобы определить уровни запасов - это значит, что ваша схема очень неправильно. Правильный способ представления акций и транзакций - через 2 отдельных объекта (таблицы).

+0

Привет. спасибо за ваш анализ. Время и дата относятся к одному и тому же событию. И salesdate + time включают будущие даты (согласно моему описанию «Таблица содержит как прошлые, так и будущие даты»).Эти ярлыки могут быть немного запутанными, поскольку это не таблица запасов/транзакций. Я выполнил запрос, как указано выше, и это вернуло самую старую запись, но когда она была изменена на ASC, она вернула последнюю запись на сегодняшний день - но это было в будущем. Любой способ не включать будущее? Если я использовал поле datetime, то как бы я выполнил запрос? – Zander

+0

Изменение поля даты и времени, чтобы стать одно поле даты и времени, как вы предложили, и с помощью следующего запроса, кажется, возвращает правильное значение: $ Result = mysql_query ( \t «SELECT оставшиеся \t ОТ quantity_time \t WHERE даты и времени <= NOW() \t Предел 1 \t "); – Zander

+0

Извините за предмет ASC/DESC - здесь уже поздно. Чтобы опустить будущие вещи, добавьте WHERE TIMESTAMP (saelesdate, salestime) <СЕЙЧАС() и удалите ABS fn (но сохраните его аргумент). Если производительность важна, добавьте индекс в новое поле. – symcbean

0
SELECT remaining FROM (
SELECT remaining, 
(UNIX_TIMESTAMP(salesdate) - UNIX_TIMESTAMP()) AS difference 
FROM quantity_time 
WHERE salesdate<=CURDATE() 
AND salestime<=CURTIME() 
) subquery 
ORDER BY difference DESC 
LIMIT 1 

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

+0

похоже, что он выполняет отметку времени на «остальном» - это целочисленное значение. Это было предназначено? – Zander

+0

@ user2288451 Он не меняет оставшийся столбец. Он использует временную метку для временного сравнения. Выполнить запрос;) – bwoebi

+0

выполнено и нет, это не сработает. «Осталось» не является значением времени. Это количество, которое я хочу вернуть ... так что я не уверен, с чем вы столкнулись. – Zander

0

Что вы подразумеваете как наиболее близко к текущему времени?

Помещенный некоторый диапазон, я не знаю, насколько точны это должно быть, но:

SELECT remaining 
FROM quantity_time 
WHERE salesdate<=CURDATE() 
AND salestime BETWEEN date_sub(NOW(), INTERVAL 24 HOUR) AND date_add(NOW(), INTERVAL 24 HOUR) 
ORDER BY salesdate DESC 
LIMIT 1 
+0

К ближайшей дате/времени Я имею в виду любую строку NOT в будущем. Я хочу найти строку, которая была в прошлом, но ближе всего к текущей дате/времени. – Zander

Смежные вопросы