sqlite относительно даты и времени запроса - PullRequest
0 голосов
/ 08 мая 2018

Помогите мне решить эту проблему.

У меня есть определенные данные, хранящиеся в БД в миллисекундах. Но это был не тот формат, который я хотел, поэтому я преобразовал его в формат фактической даты. Формат обновляется как новый столбец во время выполнения. strftime(MillisField*1000,'%Y %m %d %H:%M:%s') как дата.

Возвращает фактический формат даты и времени в новом столбце.

Но проблема здесь в том, что мне нужны последние шесть месяцев каких-то конкретных данных, поэтому я попробовал это:

MillisField > 2017-12-01

Это не показывало мне данные за последние шесть месяцев, но, если я попробую это:

MillisField > 1512066600000

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

1 Ответ

0 голосов
/ 08 мая 2018

2017-12-01 = 2004 , т. Е. Без кавычек является числовым, поэтому 01 и 12 вычитаются из 2017, и, следовательно, результат равен 2004, что намного меньше 1512066600000.

'2017-12-01' - строка, которая может привести к противоречивым результатам для самостоятельного сравнения.

Что вам нужно сделать, так это убедиться, что вы сравниваете лайк, а не разговорное сравнение яблок и апельсинов.

Следующее может помочь лучше понять, как вы можете сравнивать и как не следует

  • две заданные даты 2017-12-01 (после даты в миллисах для проверки) и 2000-01-01 (перед данными в миллисах для проверки).

: -

SELECT
    date('2000-01-01') AS date001,
    date('2017-12-01') AS date002,

    datetime('2000-01-01') AS dattim001,
    datetime('2017-12-01') AS dattim002,

    strftime('%s','2000-01-01') AS secs_date001, --  946684800
    strftime('%s','2017-12-01') AS secs_date002, -- 1512086400 (2017-11-30 18:30:00)

    datetime(1512066600,'unixepoch') AS comparison_as_date,

-- Is 946684800 (2000-01-01) > 1512066600 (2017-11-30) (NO but!!)
    datetime('2000-01-01') > 1512066600 AS compare001, -- 1 = true = yes (WRONG)
    CAST(datetime('2000-01-01') AS INTEGER) > 1512066600 AS compare002, -- 0 = false = no  (CORRECT)
    datetime('2000-01-01') > datetime(1512066600,'unixepoch') AS compare003, -- 0 = false = no (CORRECT)
    strftime('%s','2000-01-01') > 1512066600 AS compare004, -- 1 = true = yes (WRONG)
    CAST(strftime('%s','2000-01-01') AS INTEGER) > 1512066600 AS compare005, -- 0 = false = no (CORRECT)

-- Is 1512086400 (2017-12-01) > 1512066600000 (2017-11-30) (YES but!!)
    datetime('2017-12-01') > 1512066600 AS compare101, -- 1 = true = yes (CORRECT)
    CAST(datetime('2017-12-01') AS INTEGER) > 1512066600 AS compare102, -- 0 = false = no  (WRONG) 
    datetime('2017-12-01') > datetime(1512066600,'unixepoch') AS compare103, -- 1 = true = yes (CORRECT)
    strftime('%s','2017-12-01') > 1512066600 AS compare104, -- 1 = true = yes (CORRECT)
    CAST(strftime('%s','2017-12-01') AS INTEGER) > 1512066600 AS compare105 -- 1 = true = yes (CORRECT)

Следовательно: -

  • сравнить001 / 101, сравнить002 / 102 и сравнить004 / 104 не всегда вернут правильные результаты
  • Compare003 / 103 и Compare005 / 105 соответствуют

т.е. * * тысяча двадцать восемь

datetime('2000-01-01') > datetime(1512066600,'unixepoch')

и

CAST(strftime('%s','2000-01-01') AS INTEGER) > 1512066600

Надежны (т.е. они преобразуют различные форматы в совместимые форматы для сравнения)

Результаты приведенного выше SQL

Выше приведено (разделено на 2 для отображения): - enter image description here enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...