SQLite选择计数记录从10小时前开始

时间:2018-12-08 20:33:08

标签: sqlite select

我有这个数据库

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

我想计算从10个小时到现在的所有值= -1和Time <(现在10个小时)的记录

我有这个查询,总是返回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 :(得分:1)

说明

您的问题将归因于存储在时间列中的值不是公认的格式,并且由于不进行比较而变得复杂。

可在SQL As Understood By SQLite - Date And Time Functions - Time Strings处找到SQLite识别的格式。

例如 YYYY-MM-DD HH:MM:SS (例如2018-12-09 12:40:01)就是这种公认的格式。

您的查询是(假设来自c#的2018年9月12日上午12:40:01,运行时相同)说:-

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

因为这些值是非数字的,所以将逐个字符地进行比较,因此使用这9次IS大于2(当然,如果它是09/12 .....那么IS NOT)。

如果基础数据采用公认的格式,则确保类似比较的正确方法是,确保双方都比较dimetime,因此SQL实际上应该是:-

SELECT count(*) FROM Ticks WHERE Value=-1 AND datetime(time) >= datetime('now', '-10 hours')
  • 仅在时间列中的日期是示例格式以外的其他公认格式时,才可能需要datetime(time)。

-请注意,您可能需要结合本地时间来调整时间,例如datetime(time) >= datetime('now','localtime', '-10 hours')

  • 按照

  •   

    “ localtime”修饰符(12)假定其左侧的时间字符串为   以世界标准时间(UTC)进行调整,   它显示本地时间。如果“ localtime”遵循的时间不是   UTC,则行为是不确定的。 “ utc”修饰符是   与“本地时间”相反。 “ utc”假定其左侧的字符串为   在当地时区,并将该字符串调整为UTC。如果   先前的字符串不在本地时间,则“ utc”的结果为   未定义。

修复

要解决此问题,您需要

  • 根据时间列中值的格式,对时间列进行复杂的重新格式化(不推荐)
    • 或确保该值以SQlite识别的格式存储。

如果时间是插入刻度行的当前时间,则可以使用time DATETIME DEFAULT CURRENT_TIMESTAMP作为时间列的定义,而不为提供值时间列。

否则,应在存储值之前将值的格式更改为可识别的格式。