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

  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'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 секунд, но достаточно хорош для обсуждения здесь:)