Вопрос по sqlite, date, android – Сравните даты (хранятся в виде строки) в базе данных Android?

15

Я храню даты какString в моей базе данных, в этом формате:

YYYY-MM-DD HH:MM:SS

который является одним из поддерживаемых форматов (http://www.sqlite.org/lang_datefunc.html). Теперь я хочу сравнить эти сохраненные даты (ну, строки) с другими датами. Мои даты хранятся в столбцеcolumn_dateтак что я пытаюсь это:

SELECT  * FROM MyTable
WHERE 
(Date(column_date) >= Date (2000-01-01) AND Datetime(column_date) <= Datetime (2050-01-01))

Когда я читаю документацию,The date and time functions use a subset of IS0-8601 date and time formats. The date() function returns the date in this format: YYYY-MM-DD. поэтому я полагаю, что делаю все правильно - я создаю дату из сохраненной строки и сравниваю ее с датой, созданной из другой строки.

Но это не работает, даже когдаcolumn_date дата этого года, и, как вы можете видеть, даты начала и окончания очень благосклонны. Попробовал также это (использовал datetime вместо date):

SELECT  * FROM MyTable
    WHERE 
    (datetime(column_date) >= Date (2000-01-01) AND datetime(column_date) <= Datetime (2050-01-01))

и это (используйте между вместо & lt; = и & gt; =)

SELECT  * FROM MyTable
    WHERE 
    (Date(column_date) between Date (2000-01-01) AND Datetime (2050-01-01))

и все другие возможные комбинации. Что, черт возьми, я делаю неправильно, я тупой, или документальная ложь, или я пропустил что-то очень важное? Пытаюсь найти решение несколько часов, но ничего не получается ...

Ваш Ответ

5   ответов
2

Дата, занесенная в таблицу SQLite, будет TEXT, а данные даты должны быть сохранены как & quot; 2012-12-31 00: 12: 00 & quot; отформатируйте, чтобы доза сравнения не доставляла вам хлопот, и если мы посчитаем, что поля являются date_from и date_to, и мы сохраняем текущую дату в to_date, тогда мы должны получить текущую дату как ниже и

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM,-dd HH:mm:ss");
        String to_date = sdf.format(new Date());

и запрос SQL должен быть

    crs = db.rawQuery(
      "SELECT _id, date_from, date_to, done_or_not, list_name " +
      "FROM list_tbl " +
      "WHERE " +
      "date_from <= Datetime('"+to_date+"') AND date_to >= Datetime('"+to_date+"')", null);
6
SELECT *
FROM MyTable
WHERE 
    column_date BETWEEN '2000-01-01 00:00:00' AND '2050-01-01 23:00:59'

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

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

мы можем проверить эту дату 01-01-2011 00:00:00?
Я думал, что column_date было строкой - VARCHARS? Но DATETIME тоже подойдет, как стандарт * 2000-01-01T00: 0: 00 & apos; и "2000-01-01 00: 00: 00"; конвертируемые тоже.
это работает ... но как это возможно? Вы сравниваете строки с функцией даты (между)? qkx
Это работает, но это оптимальное решение?
@PintuCorna'2011-01-01 00:00:00' так должно быть. ИлиT вместо места, чтобы придерживаться официального стандарта ISO. Как ни странно, стандарт dd-MM-гггг был (все еще используется в Нидерландах), ноneutral уникальный гггг-ММ-дд сейчас одобрен. Делает меня оптимистом, эсперанто и других начинаний.
19

если вы храните даты в виде строк в формате

YYYY-MM-DD HH:mm:ss  

==== & GT; тогда ваше поле даты является типом данных DateTime

Таким образом, вы должны использовать такой запрос

select * 
  from MyTable 
  where mydate >= Datetime('2000-01-01 00:00:00') 
  and mydate <= Datetime('2050-01-01 23:00:59')

Вы также можете использовать фрагмент, заданный @Joop Eggen, с оператором, таким же подходом.

BETWEEN Оператор логически эквивалентен паре сравнений."x BETWEEN y AND z" эквивалентно"x>=y AND x<=z" за исключением того, что с BETWEEN, выражение x вычисляется только один раз. см sqlite3документы

см. раздел 1.2!
В SQLite нет класса хранения, предназначенного для хранения дат и / или времени !! см. официальный документsqlite.org/datatype3.html  Вы ссылаетесь на Sqlite на Sql, что, как мне кажется, сбивает вас с толку. Sqlite не поддерживает формат даты, который только сохраняет дату в виде строки или реального
это работает, но все еще не могу понять это. В документации четко сказано, что дата или дата и время возвращаются DATE. И мой столбец является строкой. Так как это возможно, что вы можете сравнить String (= mydate) с датой (дата, созданная из строки 2000-01-01 00:00:00 с использованием функции datetime)? Это не логично. Почему вы не применили Datetime и к моему столбцу, если это строка? qkx
на самом деле, для меня это логически правильно: Datetime (строка mydate) & lt; = Datetime (другая строка даты). Но это не работает, и ваш код работает;) Забавно qkx
Я не верю, что это точно ... из документов SQLite "Функция date () возвращает дату в следующем формате: YYYY-MM-DD". То, как я это читаю, означает, что, хотя данные хранятся в формате DateTime, используяDate() вернет только часть даты этого. Это не правильно?
3

Я думаю, что ваша проблема здесь ...

AND Datetime(column_date) <= Datetime (2050-01-01))

Почему вы используете Datetime здесь вместо Date?

Попробуй это:

SELECT  * FROM MyTable WHERE (Date(column_date) >= Date (2000-01-01) AND Date(column_date) <= Date (2050-01-01))
это решило проблему
мы можем проверить этот формат 01-01-2000?
0

Сравните даты (хранятся в виде строки) в базе данных SQLite Android. Использовать дату в12/07/2015 отформатируйте и используйте запрос как этот:

SELECT * FROM tableName WHERE Date >=('12/07/2015') and appointmentDate <('13/07/2015')";

Это работает для меня.

Это работает только в текущем месяце, после изменения месяца оно не работает.

Похожие вопросы