SQLite выберите количество записей от 10 часов назад - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть эта база данных

Table [Ticks]
    Fields: 2
        [Value]: INT
        [Time]: DATETIME
    Indexes: 1
        [TicksIdx]
            [Time] 
            [Value] 
    Triggers: 0
    Table constraints: 
        Primary Key: 
            Fields: 
            On Conflict: 
        Foreign Keys: 0
        Unique constraints: 0
        Check constraints: 0
Table [Ticks] end

И я хочу подсчитать все записи со значением = -1 и временем <(сейчас-10 часов) с 10 часов назад до настоящего времени </p>

У меня есть этот запрос, и он всегда возвращает 0

select count(*) from Ticks where Value=-1 and
time>=datetime('now', '-10 hours')

Если я изменю запрос на этот, то он возвращает все записи

select count(*) from Ticks where Value=-1 and
time<datetime('now', '-10 hours')

, и у меня есть записи со значениями времени, более поздними, чем 10часы

1 Ответ

0 голосов
/ 09 декабря 2018

Пояснения

Ваша проблема будет связана с тем, что значение, хранящееся в столбце времени, не находится в распознанном формате, что усложняется также несоответствием для подобного.

Распознанные форматы SQLite могутможно найти здесь SQL как понял SQLite - функции даты и времени - строки времени .

Например, ГГГГ-ММ-ДД ЧЧ: ММ: СС (например, 2018-12-09 12:40:01) является таким признанным форматом.

Ваш запрос (при условии, что 12.12.2008 12:40:01 из c # и время выполнения то же самое) говорит: -

  • - 9/12/2018 12:40:01 > = 2018-12-09 12: 40: 01

, поскольку значения не числовые, проводится сравнение по символам, поэтому с использованием этих времен 9 ЕСТЬ больше 2 (конечно, если бы это было 09/12 ..... тогда НЕТ).

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

SELECT count(*) FROM Ticks WHERE Value=-1 AND datetime(time) >= datetime('now', '-10 hours')
  • note date (время) может потребоваться, только если дата в столбце времени была другим распознанным форматом, чем примерный формат.

- обратите внимание, что вам может потребоваться указать местное время, чтобы настроить время, например datetime(time) >= datetime('now','localtime', '-10 hours')

  • согласно

  • Местное время«Модификатор (12) предполагает, что строка времени слева от него имеет универсальное координированное время (UTC) и корректирует строку времени так, чтобы она отображала местное время.Если «местное время» следует за временем, которое не является UTC, то поведение не определено.Модификатор "utc" является противоположностью "localtime".«utc» предполагает, что строка слева находится в местном часовом поясе, и корректирует эту строку в UTC.Если предыдущая строка не по местному времени, то результат «utc» не определен.

Fix (es)

ИсправитьДля этого вам необходимо либо

  • выполнить сложное переформатирование столбца времени, в зависимости от формата значения в столбце времени, для сравнения (не рекомендуется)
    • или убедитесь, что значение сохранено в формате, распознаваемом SQlite.

Если время является текущим временем вставки строки тиков, вы можете использовать time DATETIME DEFAULT CURRENT_TIMESTAMP в качестве определения для столбца time и не указывать значение для столбца time при вставке строки.

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

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