2013-02-25 3 views
1

У меня есть проблемы с помощью следующего запроса SQL (MySQL):Расчет в HAVING условие

SELECT CAST(LEFT(SUBSTR(STORE.VALUE, LOCATE('timestamp":', STORE.VALUE)+11),13) AS UNSIGNED) as starttime 
FROM STORE 
HAVING starttime <= MIN(starttime)+600000; 

Этот запрос возвращает 1 значение: 1344543364317 это минимальное значение STARTTIME столбца.

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

SELECT CAST(LEFT(SUBSTR(STORE.VALUE, LOCATE('timestamp":', STORE.VALUE)+11),13) AS UNSIGNED) as starttime 
FROM STORE 
HAVING starttime <= 1344543964317; 

Почему этот запрос возвращает больше значений?

Редактировать

Несколько больше объяснений по поводу данных: К сожалению, большинство данных является довольно бесполезно. В основном таблица содержит только два столбца: Key, Value. Ключ здесь не важен. Значение содержит такие вещи: {"changeset":"Z:1>6b|5+6b$Welcome to Etherpad Lite!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nEtherpad Lite on Github: http://j.mp/ep-lite\n","meta":{"author":"","timestamp":1344543364317,"atext":{"text":"Welcome to Etherpad Lite!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nEtherpad Lite on Github: http://j.mp/ep-lite\n\n","attribs":"|6+6c"}}}

Так что я в основном просто извлекаю значение временной метки и отображаю его как виртуальный столбец, называемый starttime. Первые 10 значений столбца STARTTIME являются

1344543364317 
1344543365939 
1344543366439 
1344543366454 
1344543368794 
1344553433259 
1344553434054 
1344553499779 
1344553500871 
1344553502104 
+0

Дайте образцы данных. Чтобы мы могли найти решение. –

+0

Я попытался дать некоторые данные, см. Редактирование вопроса. – jokr

ответ

3

Ваше значение, 1344543964317, это путь больше, чем 4294967295, который является самым большим из возможных значений для UNSIGNED целого. Вместо этого используйте BIGINT.

+0

Хорошо, я ожидал чего-то подобного, но где-то читал, что беззнаковый int интерпретируется как BIGINT. Как преобразовать это в BIGINT? Кажется, что MySQL не поддерживает это из коробки. – jokr

0

Это не очень элегантный, но у меня есть решение. Кажется, вы не можете использовать startttime в правой части уравнения, поэтому вам нужно выполнить повторный исходный расчет.

SELECT CAST(LEFT(SUBSTR(VALUE, LOCATE('timestamp":', VALUE)+11),13) AS UNSIGNED) AS starttime 
FROM STORE 
HAVING starttime <= 
    (SELECT MIN(CAST(LEFT(SUBSTR(STORE.VALUE, LOCATE('timestamp":', STORE.VALUE)+11),13) AS UNSIGNED)) FROM STORE) + 60000 
Смежные вопросы