Я запускаю sqlite для выбора данных между двумя диапазонами для отчета о продажах. Чтобы выбрать данные из двух дат, я использую следующий оператор:
SELECT * FROM test WHERE date BETWEEN "11/1/2011" AND "11/8/2011";
Это выражение захватывает все даты, даже те, которые не соответствуют критериям. Формат даты, который вы видите, находится в том же формате, который я возвращаю. Я не уверен, что неправильно, но признаю любую помощь, которую я могу найти. Спасибо!
SQLLite требует, чтобы даты находились в формате YYYY-MM-DD
. Поскольку данные в вашей базе данных и строка в вашем запросе не указаны в этом формате, возможно, это относится к вашим "датам" в виде строк.
BETWEEN '2011-11-01' AND '2011-11-02'
.
Измените свои данные на эти форматы, чтобы использовать форматы sqlite datetime.
YYYY-MM-DD
YYYY-MM-DD HH:MM
YYYY-MM-DD HH:MM:SS
YYYY-MM-DD HH:MM:SS.SSS
YYYY-MM-DDTHH:MM
YYYY-MM-DDTHH:MM:SS
YYYY-MM-DDTHH:MM:SS.SSS
HH:MM
HH:MM:SS
HH:MM:SS.SSS
now
DDDDDDDDDD
SELECT * FROM test WHERE date BETWEEN '2011-01-11' AND '2011-08-11'
MM/DD/YYYY
, я подозреваю, что это все равно не сработает, поскольку данные в его базе данных будут обрабатываться как строки, а не как даты.
Еще один способ выбора между датами в SQLite - использовать мощную функцию strftime:
SELECT * FROM test WHERE strftime('%Y-%m-%d', date) BETWEEN "11-01-2011" AND "11-08-2011"
Они эквивалентны в соответствии с https://sqlite.org/lang_datefunc.html:
date(...)
strftime('%Y-%m-%d', ...)
но если вы хотите больше выбора, у вас есть.
Или вы можете передать свою строку в формат даты с помощью функции date. Даже дата хранится как ТЕКСТ в БД. Подобно этому (наиболее работоспособный вариант):
SELECT * FROM test WHERE date(date)
BETWEEN date('2011-01-11') AND date('2011-8-11')
Особая благодарность Jeff и vapcguy ваша интерактивность действительно обнадеживает.
Вот более сложный оператор, который полезен, когда длина между '/' неизвестна::
SELECT * FROM tableName
WHERE julianday(
substr(substr(date, instr(date, '/')+1), instr(substr(date, instr(date, '/')+1), '/')+1)
||'-'||
case when length(
substr(date, instr(date, '/')+1, instr(substr(date, instr(date, '/')+1),'/')-1)
)=2
then
substr(date, instr(date, '/')+1, instr(substr(date, instr(date, '/')+1), '/')-1)
else
'0'||substr(date, instr(date, '/')+1, instr(substr(date, instr(date, '/')+1), '/')-1)
end
||'-'||
case when length(substr(date,1, instr(date, '/')-1 )) =2
then substr(date,1, instr(date, '/')-1 )
else
'0'||substr(date,1, instr(date, '/')-1 )
end
) BETWEEN julianday('2015-03-14') AND julianday('2015-03-16')
julianday()
из другого поста все еще применяется, хотя. Это в основном тот же ответ, что и другой, за исключением того, что вы добавили условную логику, чтобы добавить начальные нули для однозначных дней и месяцев. Вероятно, следовало добавить к другому ответу или заменить его этим редактированием. Принято, поскольку это более правильно, хотя.
SELECT *
FROM TableName
WHERE julianday(substr(date,7)||'-'||substr(date,4,2)||'-'||substr(date,1,2)) BETWEEN julianday('2011-01-11') AND julianday('2011-08-11')
Обратите внимание, что я использую формат: dd/mm/yyyy
Если вы используете d/m/yyyy, измените substr()
Надеюсь, это поможет вам.
julianday()
, однако, и при использовании этого предполагается, что ваша дата указана в UTC, потому что julianday()
рассчитывается по времени по Гринвичу, так что вы можете в конечном итоге включить даты, которые вы не хотите, и включая даты, которые вы делаете, если ваши даты по местному времени. Вы должны иметь возможность просто сделать SELECT * FROM TableName WHERE substr(date,7)||'-'||substr(date,4,2)||'-'||substr(date,1,2) BETWEEN '2011-01-11' AND '2011-08-11'
и это должно работать.