Сравнение 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')

Ответ 1

SQLite не имеет выделенного datetime типы, но имеет несколько функций datetime. Следуйте форматам представления строк (на самом деле только форматы 1-10), которые понимаются этими функциями (сохраняя значение как строку), а затем вы можете их использовать, плюс лексикографическое сравнение по строкам будет соответствовать сопоставлению даты и времени (если вы не используете попробуйте сравнить даты со временем или временем с временем, что в любом случае не имеет большого смысла).

В зависимости от того, какой язык вы используете, вы даже можете получить автоматическое преобразование. (Это не относится к сравнениям в операторах SQL, как пример, но облегчит вашу жизнь.)

Ответ 2

Чтобы решить эту проблему, я сохраняю даты как YYYYMMDD. Таким образом,  where mydate >= '20090101' and mydate <= '20050505'

Он просто РАБОТАЕТ все время. Вам может потребоваться только написать парсер для обработки того, как пользователи могут вводить свои даты, чтобы вы могли конвертировать их в YYYYMMDD.

Ответ 3

У меня была такая же проблема в последнее время, и я решил ее так:

SELECT * FROM table WHERE 
    strftime('%s', date) BETWEEN strftime('%s', start_date) AND strftime('%s', end_date)

Ответ 4

Следующее работает отлично для меня, используя SQLite:

SELECT * 
    FROM ingresosgastos 
    WHERE fecharegistro BETWEEN "2010-01-01" AND "2013-01-01"

Ответ 5

Sqlite не может сравниваться по датам. нам нужно преобразовать в секунды и применить его как целое.

Пример

SELECT * FROM Table  
WHERE  
CAST(strftime('%s', date_field)  AS  integer) <=CAST(strftime('%s', '2015-01-01')  AS  integer) ;

Ответ 6

После меня работали.

SELECT *
FROM table_log
WHERE DATE(start_time) <= '2017-01-09' AND DATE(start_time) >= '2016-12-21'

Ответ 7

Ниже приведены методы сравнения дат, но до этого нам нужно определить формат даты, хранящейся в 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

Ответ 8

Вы также можете написать свои собственные функции пользователя для обработки дат в выбранном вами формате. SQLite имеет довольно простой способ для написания собственных пользовательских функций. Например, я написал несколько, чтобы добавить длительность времени вместе.

Ответ 9

Мне нужно было сохранить время с информацией о часовом поясе в нем и смог получить запросы, работающие в следующем формате:

"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

Ответ 10

Мой запрос я сделал следующим образом:

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, тоже будет использовать этот ответ!

Ответ 11

У меня есть ситуация, когда я хочу получать данные до двух дней назад и до конца сегодняшнего дня. Я пришел к следующему.

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