SQLite DateTime сравнение
Я не могу получить надежные результаты от запроса к базе данных 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')
11 ответов:
SQLite не имеет выделенного datetime типы, но имеет несколько функций datetime. Следуйте форматам строкового представления (на самом деле только форматы 1-10), понимаемым этими функциями (сохранение значения в виде строки), а затем вы можете их использовать, а также лексикографическое сравнение строк будет соответствовать сравнению datetime (если вы не пытаетесь сравнить даты со временем или даты со временем, что не имеет большого смысла в любом случае.)
в зависимости от того, какой язык вы используете, вы можете даже сделать автоматическое преобразование. (Что не относится к сравнениям в SQL-операторах, таких как пример, но облегчит вашу жизнь.)
чтобы решить эту проблему, я храню даты как
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'
Ниже приведены методы сравнения дат, но перед этим нам нужно определить формат даты, хранящейся в БД
у меня есть даты, хранящиеся в формате MM/DD / YYYY HH:MM, поэтому его нужно сравнить в этом формате
ниже запрос сравнивает преобразование даты в формат MM/DD / YYY и получить данные за последние пять дней до сегодняшнего дня. Между оператором поможет и вы можете просто указать дату начала и дату окончания.
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'));ниже запрос будет использовать больше, чем оператор (>).
select * from myTable where myColumn > strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day');все вычисления, которые я сделал, используют текущее время, вы можете изменить формат и дату в соответствии с вашими потребностями.
надеюсь, что это поможет вам
Summved
вы также можете написать ваши собственные пользовательские функции для обработки дат в выбранном формате. SQLite имеет довольно простой метод для написания собственных пользовательских функций. Например, я написал несколько, чтобы добавить продолжительность времени вместе.
Я должен был хранить время с информацией о часовом поясе в нем, и смог получить запросы, работающие со следующим форматом:
"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
мой запрос я сделал следующим образом:
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, тоже будет использовать этот ответ!
у меня есть ситуация, когда мне нужны данные до двух дней назад и до конца сегодняшнего дня. Я пришел к следующему.
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')использование предложения between для ясности.
было бы немного лучше. Он по-прежнему не учитывает високосные секунды, в которых час может на самом деле иметь более 60 секунд, но достаточно хорош для обсуждения здесь :)
Comments