我有这个数据库
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小时的记录
答案 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次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('now','localtime', '-10 hours')
按照
“ localtime”修饰符(12)假定其左侧的时间字符串为 以世界标准时间(UTC)进行调整, 它显示本地时间。如果“ localtime”遵循的时间不是 UTC,则行为是不确定的。 “ utc”修饰符是 与“本地时间”相反。 “ utc”假定其左侧的字符串为 在当地时区,并将该字符串调整为UTC。如果 先前的字符串不在本地时间,则“ utc”的结果为 未定义。
要解决此问题,您需要
如果时间是插入刻度行的当前时间,则可以使用time DATETIME DEFAULT CURRENT_TIMESTAMP
作为时间列的定义,而不为提供值时间列。
否则,应在存储值之前将值的格式更改为可识别的格式。