Я не могу получить надежные результаты запроса от базы данных sqlite, используя строку datetime в качестве сравнения:
select *
from table_1
where mydate >= '1/1/2009' and mydate <= '5/5/2009'
как мне обрабатывать сравнение datetime с sqlite?
обновление: Поле mydate является типом данных DateTime
Решение:
следуя за функцией datetime и имеющей строковый формат в виде YYYY-MM-DD HH: mm: ss я достигнуты хорошие результаты следующим образом
select *
from table_1
where mydate >= Datetime('2009-11-13 00:00:00')
and mydate <= Datetime('2009-11-15 00:00:00')
SQLite не имеет выделенного datetime типы, но имеет несколько функций datetime. Следуйте форматам представления строк (на самом деле только форматы 1-10), которые понимаются этими функциями (сохраняя значение как строку), а затем вы можете их использовать, плюс лексикографическое сравнение по строкам будет соответствовать сопоставлению даты и времени (если вы не используете попробуйте сравнить даты со временем или временем с временем, что в любом случае не имеет большого смысла).
В зависимости от того, какой язык вы используете, вы даже можете получить автоматическое преобразование. (Это не относится к сравнениям в операторах SQL, как пример, но облегчит вашу жизнь.)
date
и datetime
Чтобы решить эту проблему, я сохраняю даты как YYYYMMDD
. Таким образом, where mydate >= '20090101' and mydate <= '20050505'
Он просто РАБОТАЕТ все время. Вам может потребоваться только написать парсер для обработки того, как пользователи могут вводить свои даты, чтобы вы могли конвертировать их в YYYYMMDD
.
У меня была такая же проблема в последнее время, и я решил ее так:
SELECT * FROM table WHERE
strftime('%s', date) BETWEEN strftime('%s', start_date) AND strftime('%s', end_date)
Следующее работает отлично для меня, используя SQLite:
SELECT *
FROM ingresosgastos
WHERE fecharegistro BETWEEN "2010-01-01" AND "2013-01-01"
Sqlite не может сравниваться по датам. нам нужно преобразовать в секунды и применить его как целое.
Пример
SELECT * FROM Table
WHERE
CAST(strftime('%s', date_field) AS integer) <=CAST(strftime('%s', '2015-01-01') AS integer) ;
После меня работали.
SELECT *
FROM table_log
WHERE DATE(start_time) <= '2017-01-09' AND DATE(start_time) >= '2016-12-21'
Ниже приведены методы сравнения дат, но до этого нам нужно определить формат даты, хранящейся в DB
У меня есть даты, хранящиеся в формате MM/DD/YYYY HH: MM, поэтому его нужно сравнивать в этом формате
Ниже запроса сравнивается преобразование даты в формат MM/DD/YYY и получение данных за последние пять дней до сегодняшнего дня. Оператор BETWEEN поможет, и вы можете просто указать дату начала и дату окончания.
select * from myTable where myColumn BETWEEN strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day') AND strftime('%m/%d/%Y %H:%M',datetime('now','localtime'));
Ниже запрос будет использоваться больше, чем operator ( > ).
select * from myTable where myColumn > strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day');
Все вычисления, которые я сделал, используют текущее время, вы можете изменить формат и дату в соответствии с вашими потребностями.
Надеюсь, это поможет вам
Summved
Мне нужно было сохранить время с информацией о часовом поясе в нем и смог получить запросы, работающие в следующем формате:
"SELECT * FROM events WHERE datetime(date_added) BETWEEN
datetime('2015-03-06 20:11:00 -04:00') AND datetime('2015-03-06 20:13:00 -04:00')"
Время хранится в базе данных как обычный ТЕКСТ в следующем формате:
2015-03-06 20:12:15 -04:00
Вы также можете написать свои собственные функции пользователя для обработки дат в выбранном вами формате. SQLite имеет довольно простой способ для написания собственных пользовательских функций. Например, я написал несколько, чтобы добавить длительность времени вместе.
У меня есть ситуация, когда я хочу получать данные до двух дней назад и до конца сегодняшнего дня. Я пришел к следующему.
WHERE dateTimeRecorded between date('now', 'start of day','-2 days')
and date('now', 'start of day', '+1 day')
Хорошо, технически я также буду в полночь завтра, как и оригинальный плакат, если бы были какие-то данные, но мои данные все исторические.
Ключевая вещь, которую следует помнить, первоначальный плакат исключил все данные после 2009-11-15 00:00:00. Таким образом, любые данные, записанные в полночь 15-го числа, были включены, но никаких данных после полуночи 15-го не было. Если их запрос был,
select *
from table_1
where mydate between Datetime('2009-11-13 00:00:00')
and Datetime('2009-11-15 23:59:59')
Использование пояснения для ясности.
Было бы немного лучше. Он по-прежнему не учитывает секунды прыжка, в которых час может иметь более 60 секунд, но достаточно хорош для обсуждения здесь:)
Мой запрос я сделал следующим образом:
SELECT COUNT(carSold)
FROM cars_sales_tbl
WHERE date
BETWEEN '2015-04-01' AND '2015-04-30'
AND carType = "Hybrid"
Я получил подсказку @ifredy. Все, что я сделал, я хотел, чтобы этот запрос запускался в iOS, используя Objective-C. И это работает!
Надеюсь, что кто-то, кто занимается разработкой iOS, тоже будет использовать этот ответ!
mydate
? Я предполагаю, что это не один из поддерживаемых форматов SQLite: sqlite.org/lang_datefunc.html