Что такое команда SQLite для получения данных между временем начала и окончания? - PullRequest
1 голос
/ 23 июля 2011

Допустим, моя база данных называется «data», а ее второй столбец называется «datetime».Формат моего времени: 22.07.2011, 12:00:00.Если я хочу получить информацию с 12:00 до 13:00 сегодня, как мне это сделать?

SELECT * FROM data WHERE 
strftime('%m/%d/%Y %H:%M:%S', datetime) > strftime('%m/%d/%Y %H:%M:%S', '7/22/2011 12:00:00') 
AND 
strftime('%m/%d/%Y %H:%M:%S', datetime) < strftime('%m/%d/%Y %H:%M:%S', '7/22/2011 13:00:00')

не сработает.

Ответы [ 2 ]

2 голосов
/ 23 июля 2011

Я понял это неправильно - позор мне.strftime будет считывать только значения ISO 8601 (или отметка времени / юлианский период). Указанный формат не применяется к входу - он предназначен только для значения .

По этой причине данные в база данных должна все еще иметь естественный порядок сортировки.Предлагаемые форматы: ISO 8601 (строка), отметка времени (целое число) и юлианская дата (число с плавающей запятой).Использование даты, такой как m/d/y в базе данных не будет работать для сравнения диапазонов, потому что она не соответствует естественному порядку.

strftime и друзья просто позволяют генерировать одну иззначения, полезные для сравнения - например, можно преобразовать из ISO 8601 / метка времени / юлианский ввод в нестандартный / ISO 8601 / метку времени / юлианский-дата .Они не могут напрямую конвертировать из пользовательского значения.

Самый простой способ исправить базу данных - это, вероятно, использовать такой язык, как Python, для написания скрипта для преобразования существующих данных.Небольшая Java-программа также может быть написана с использованием SimpleDateFormat для анализа существующих значений и их записи с использованием одного из рекомендуемых типов.


Historical:

Попробуйте по частям с консоли (это позволит должен быстрее экспериментировать с запросом) - первый условный, затем второй.Что возвращает, что и почему?После того, как каждая часть будет работать, будет работать их размещение.

Есть несколько ошибок формата strftime - см. Дата и время для форматов и проверьтеснова строки :) Также, если используется более подходящий формат даты (ISO 8601), можно просто использовать datetime и не беспокоиться об указании формата явно.Значения ISO 8601 также лексически сортируются как строки - дополнительное преимущество.

Я не уверен, как обработчик Java SQLite будет обрабатывать Date при передаче в качестве параметра в параметризованный запрос(параметризованные запросы действительно должны использоваться )) ... но в любом случае это вторичная проблема текущего наблюдаемого поведения.

Счастливое кодирование.

0 голосов
/ 23 июля 2011

похоже, у вас плохой формат символа

SELECT * FROM data WHERE 
strftime('%m/%d/%Y %H:%H:%S', datetime) > strftime('%m/%d/%y %H:%M:%S', '7/22/2011 12:00:00') 
--                     ^ 
AND 
strftime('%m/%d/%y %H:%M:%S', datetime) < strftime('%m/%d/%y %H:%M:%S', '7/22/2011 13:00:00')
...