Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

Или вы можете передать свою строку в формат даты с помощью функции date. Даже дата хранится как ТЕКСТ в БД. Подобно этому (наиболее работоспособный вариант):

SELECT * FROM test WHERE date(date) 
BETWEEN date('2011-01-11') AND date('2011-8-11')

Ответ 5

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()

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

Ответ 6

Особая благодарность 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')