#sqlite #datetime #where #unix-timestamp
#sqlite #datetime #where-предложение #unix-временная метка
Вопрос:
В моей базе данных SQLite есть поле с именем created_date, и я хочу вернуть все результаты, которые больше, чем 2 дня назад.
Я запускаю это:
ВЫБЕРИТЕ strftime(‘%Y-%m-%d %H:%M:%S’, «created_date»/ 1000, ‘unixepoch’) Из журналов
Я получаю результаты, отображаемые в правильном формате datetime, но когда я добавляю это в конец:
где created_date <= datetime(‘сейчас’,’-2 дня’)
возвращаются все 10 результатов.
created_date, created_date as datetime
1552143373, 2019-03-09 21:44:55 55.000
1552143373, 2019-03-09 21:44:55 55.000
1552143373, 2019-03-09 21:27:38 38.000
1552143373, 2019-03-09 21:29:19 19.000
1552143373, 2019-03-09 21:30:06 06.000
1552143373, 2019-03-09 21:30:10 10.000
1552143373, 2019-03-09 21:41:28 28.000
1552143373, 2019-03-09 21:42:40 40.000
1552143373, 2019-03-09 21:43:25 25.000
1552143373, 2019-03-09 21:50:07 07.000
Комментарии:
1.
where created_date <= datetime('now','-2 day')
означает даты, которые старше 2 дней назад, верно?2. Если
created_date
это время Unix, вам нужно либо сравнить его с другим значением времени Unix, либо преобразовать его в строку того же формата, что и временная метка, с которой вы ее сравниваете. Попытка сравнить яблоки с апельсинами не работает.3. Если вам нужны результаты за последние 2 дня (последние 48 часов):
where created_date >= datetime('now','-2 day')
Ответ №1:
функция datetime() возвращает «ГГГГ-ММ-ДД ЧЧ: ММ: СС» — https://www.sqlite.org/lang_datefunc.html
Поэтому используйте strftime('%s','now','-2 days')
для получения целочисленной строки для сравнения.
Комментарии:
1. Когда я добавляю это, я все равно получаю результаты, в какой момент я получу только частичные результаты? например, если я установлю для нее значение -1 дней назад, я все равно также получу результаты
2. попробуйте запустить select
select strftime('%s','now','-2 days');
и посмотрите, что вы получаете, и сопоставимо ли это с данными, которые у вас есть в таблице.3. Если ваши данные умножены на миллисекунды, вам следует разделить их перед сравнением;
strftime(%s
возвращает временную метку в секундах.4. Если я запускаю этот SELECT created_date, strftime (‘%s’, ‘now’, ‘-2 дня’) из журналов, я получаю это 1552167895827, 1552145309
5. Смотрите предыдущий комментарий. Вы забыли / 1000.
Ответ №2:
-2 days
— datetime довольно специфичен в том, чтобы не пропускать ‘s’