2015-05-12 2 views
0

Я использую функцию, которая возвращает разницу между сохраненным временем и NOW()MySQL повторно использовать значение, возвращаемое функцией

Пример:

TIMESTAMPDIFF(DAY, NOW(), `stored_time`) 

Если я собираюсь использовать возвращаемое значение в одном запросе, таком как:

SELECT `column1`, `column2` TIMESTAMPDIFF(DAY, NOW(), `stored_time`) 
FROM `table` 
WHERE TIMESTAMPDIFF(DAY, NOW(), `stored_time`) > 2 

Есть ли способ повторного использования значения? Я пробовал что-то вроде этого:

SELECT `column1`, `column2` @timediff = TIMESTAMPDIFF(DAY, NOW(), `stored_time`) 
FROM `table` 
WHERE @timediff > 2 

Но это не сработает. Я ничего не знаю о переменных MySQL. Как я могу это решить?

+1

'ВЫБОР column1, Столбец2, @timediff: = TIMESTAMPDIFF (день, сейчас(), stored_time)' (разделенные и ободочной кишки добавляется). Стандарт SQL действительно требует повторения выражения столбца в условии where. Или другая конструкция. –

+0

Итак, я не могу сделать то, что хочу достичь? Я в порядке. Я просто хочу знать, могу ли я сделать это более эффективно: D – userx01

+1

Общие подвыражения будут выполняться разумно. –

ответ

0

Может быть что-то вроде

SELECT tt.`column1`, tt.`column2`, t.timediff 
FROM `table` tt 
    LEFT JOIN (SELECT TIMESTAMPDIFF(DAY, NOW(), tt.`stored_time`) as timediff) t on 1=1 
WHERE t.timediff > 2 

(это не тестировался, но может поставить вас на правильном пути, если это то, что вы ищете)

выше, по-видимому, не будет работать с MySQL (что имеет смысл ... Я больше думал о строках запроса стиля APPLY/LATERAL JOIN, которого нет в MySQL). Итак, еще одна вещь, которую вы можете попробовать это:

SELECT tt.`column1`, tt.`column2`, TIMESTAMPDIFF(DAY, t.dtnow, tt.`stored_time`) 
FROM `table` tt 
    LEFT JOIN (SELECT NOW() as dtnow) t on 1=1 
WHERE TIMESTAMPDIFF(DAY, t.dtnow, tt.`stored_time`) > 2 
+0

круто! Похоже, это сработает. Собираюсь проверить это сейчас. – userx01

+0

# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с таблицей .timediff FROM. tt – userx01

+0

@ userx01 Вы использовали мой точный запрос или что-то изменили? Если это по-другому, можете ли вы разместить точную версию, которую вы запускали? – Ruslan

0

Вы можете использовать переменную, чтобы присвоить ему значение функции, но вы должны инициализировать переменную в предложении WHERE, затем использование это в SELECT:

SELECT `column1`, `column2`, @timediff 
FROM `table` 
WHERE (@timediff:= TIMESTAMPDIFF(DAY, `stored_time`, NOW())) > 2 

в качестве побочного сведению, если вы хотите TIMESTAMPDIFF вернуть значение положительное, то вам придется пройти самую последнюю дату в качестве 3-го аргумента.

SQL Fiddle Demo

+0

Это странно. Он работает над SQL Fiddle, но не по phpmyadmin. Я использовал те же самые значения. O_o – userx01

+0

@ userx01 Вы передаете 'NOW()' в качестве третьего аргумента в 'TIMESTAMPDIFF'? –

+0

Я передаю его как второй аргумент. Потому что то, что я хочу, это 'stored_time' - сейчас. – userx01

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