Временная метка SQLite Unix получает даты старше 2 дней назад

#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’