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')
1183   11  

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, поэтому его нужно сравнить в этом формате

  1. ниже запрос сравнивает преобразование даты в формат 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')); 
    
  2. ниже запрос будет использовать больше, чем оператор (>).

      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

    Ничего не найдено.