Сравнение SQLite DateTime
Я не могу получить надежные результаты из запроса к базе данных sqlite, используя строку datetime в качестве сравнения:
select *
from table_1
where mydate >= '1/1/2009' and mydate <= '5/5/2009'
Как я должен обрабатывать сравнения datetime с sqlite?
обновление: поле mydate-это тип данных DateTime
устранение:
следуя функции datetime и имея строковый формат как гггг-ММ-ДД чч: мм: СС я достиг хороших результатов следующим образом
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'
Ниже приведены методы сравнения дат, но до этого нам нужно определить формат даты, хранящейся в DB
у меня есть даты, хранящиеся в формате 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's. Все, что я сделал, это я хотел, чтобы этот запрос был запущен в 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 секунд, но достаточно хорош для обсуждения здесь:)