2

为什么是这样

SELECT strftime('%s', timestamp,'localtime') from locationLog WHERE strftime('%s', timestamp,'localtime') > 999999999999999999 ORDER BY _id DESC

当我的所有行在“时间戳”中的值都较低时,返回任何输出

在我的情况下,上面的查询返回

1334735588
1334735349
1334734317
1334734178
1334734172
and so on...

它返回我的整张桌子。

如果我切换><它不会返回任何内容。

我想我正在尝试比较不同类型的变量或类似的东西。

4

2 回答 2

1

猜测一下,您使用的是 32 位平台,并且您使用了大于 2147483647 的整数这一事实导致您遇到了“2038 年问题”的变体。

尝试使用2147483647作为您在查询中比较的数字。

这将持续到 2038 年,届时您可能会将您的应用程序托管在 64 位平台上(或者到那时甚至可能是 128 位或 256 位!)

于 2012-04-30T10:38:26.680 回答
1

您正在将text值与integer值进行比较,因此 sqlite 将integer值转换为text,并进行字符串比较:

sqlite> select strftime('%s', '2002-02-02', 'localtime');
1012611600
sqlite> select typeof(strftime('%s', '2002-02-02', 'localtime'));
text
sqlite> select typeof(999999999999999999);
integer
sqlite> select strftime('%s', '2002-02-02', 'localtime') > 999999999999999999;
1
sqlite> select cast(strftime('%s', '2002-02-02', 'localtime') as integer) > 999999999999999999;
0

如上所示,解决方法是将 的返回值强制strftime转换为某种数值类型。

于 2012-04-30T13:53:07.273 回答