SQL Выбрать между датами - PullRequest
       8

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

62 голосов
/ 18 ноября 2011

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

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

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

Ответы [ 6 ]

86 голосов
/ 18 ноября 2011

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

29 голосов
/ 18 ноября 2011

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

Еще один способ выбора дат в 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 голосов
/ 24 мая 2014

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

SELECT * FROM test WHERE date(date) 
BETWEEN date('2011-01-11') AND date('2011-8-11')
3 голосов
/ 23 ноября 2016
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

Если вы используете д / м / гггг, измените значение substr()

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

1 голос
/ 22 декабря 2016

Особая благодарность Джеффу и 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') 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...