SQLite DateTime сравнение

78

Я не могу получить надежные результаты запроса от базы данных 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
    Какой формат даты хранится в вашем столбце mydate ? Я предполагаю, что это не один из поддерживаемых форматов SQLite: sqlite.org/lang_datefunc.html
  • 0
    OMG, это тип данных datetime
Показать ещё 4 комментария
Теги:

11 ответов

46
Лучший ответ

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

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

  • 3
    Для всех тех , кто читает первое предложение, в '17 SQLite имеет date и datetime
  • 0
    @ all3fox Есть идеи по использованию? Не могу найти нужную документацию.
Показать ещё 1 комментарий
81

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

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

  • 2
    При условии, что формат стандартизирован, чем отличается YYYY-MM-DD от тире? Разве сравнения не закончатся так же?
  • 2
    @ Damon: я думаю, что он использует int для типа данных
Показать ещё 4 комментария
25

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

SELECT * FROM table WHERE 
    strftime('%s', date) BETWEEN strftime('%s', start_date) AND strftime('%s', end_date)
  • 0
    % s должен быть заключен в одинарные кавычки, например: strftime ('% s', date)
  • 0
    Оно работает. Модифицированное решение для выбора всех строк после определенной даты: SELECT * FROM table WHERE strftime (добавлено% s)> strftime ('% s', "2017-01-01 00:00:00")
Показать ещё 1 комментарий
17

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

SELECT * 
    FROM ingresosgastos 
    WHERE fecharegistro BETWEEN "2010-01-01" AND "2013-01-01"
  • 0
    Я проверю это для iOS и дам вам знать! Работает на консоли PHPLiteAdmin SQL! code.google.com/p/phpliteadmin/downloads/...
  • 0
    Это работает для меня в iOS, Objective-C My Query выглядит следующим образом: ВЫБЕРИТЕ COUNT (carSold) ОТ cars_sales_tbl ГДЕ ДА МЕЖДУ '2015-04-01' И '2015-04-30' И carType = "Hybrid"
6

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

Пример

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

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

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

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

1

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

"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
1

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

0

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

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню