SQL выбор между датами



Я запускаю sqlite для выбора данных между двумя диапазонами для отчета о продажах. Для выбора данных между двумя датами я использую следующую инструкцию:



SELECT * FROM test WHERE date BETWEEN "11/1/2011" AND "11/8/2011";


этот оператор захватывает все даты, даже те, которые находятся вне критериев. Формат даты, который вы видите, введен в том же формате, что и я возвращаюсь. Я не уверен, что случилось, но ценю любую помощь, которую я могу найти. Спасибо!

671   6  

6 ответов:

SQLLite требует даты, чтобы быть в . Поскольку данные в вашей базе данных и строка в вашем запросе не в этом формате, он, вероятно, рассматривает ваши "даты" как строки.

измените свои данные на эти форматы, чтобы использовать форматы 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'

еще один способ выбора между датами в 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', ...)

а если вы хотите больше выбора, у вас есть.

или вы можете привести свою строку в формат даты с помощью дата. Даже дата хранится в виде текста в БД. Вот так (самый работоспособный вариант):

SELECT * FROM test WHERE date(date) 
BETWEEN date('2011-01-11') AND date('2011-8-11')
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()

надеюсь, что это поможет вам.

отдельное спасибо Джефф и 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') 

Comments

    Ничего не найдено.