2014-10-23 3 views
0

У меня есть база данных, которая содержит некоторые даты тревоги:ABS не работает в SQLite

id   timealarm      status 
1   2014-10-23 13:30:00 +0000   1 
2   2014-10-23 13:29:00 +0000   1 

Все, что я пытаюсь сделать, это отправить текущую дату в SQL и выполнить абс, так что принимает значение (дата), ближайшей к текущей дате:

SELECT * FROM records WHERE status = '1' ORDER BY ABS('2014-10-23 13:27:09 +0000' - timealarm) LIMIT 1 

в этом случае этот синтаксис возвращает мне ИН 1, вместо ид 2, почему и как решить эту проблему?

EDIT 

Поле timealarm является VARCHAR

+1

Чтобы быть ясно: вы пытаетесь взять абсолютную величину разницы между двумя строками? –

+0

Нет, я пытаюсь получить значение ближе к реальной дате –

+0

Моя настоящая дата - 2014-10-23 13:27:09 +0000, дата ближайшей внутри базы данных - это данные с id = 2, но мой код получает дату id = 1, почему? –

ответ

0

При попытке вычитать строки друг от друга, база данных преобразует их в номера. Итак, вы заканчиваете вычитание 2014 с 2014 года, что приводит к тому же значению для всех строк.

Чтобы иметь возможность вычислить differnce, преобразовать строки даты в некоторое число (это требует сбросив информации часового пояса, который не понят SQLite-х date functions):

... 
ORDER BY abs(julianday('2014-10-23 13:27:09') - julianday(substr(timealarm, 1, 19))) 
... 
+0

извините, но этот код не работает, мое поле timealarm является полем varchar ... Мне нужно изменить дату на сегодняшний день? –

+0

Существует нет типа данных даты/времени (http://www.sqlite.org/datatype3.html#datetime). Строки работают очень хорошо, если вы используете поддерживаемый формат. –

+0

Странно, я использую sqlite3, и этот код работает не очень хорошо. –