在我的应用程序中,我将时间戳存储为我保存的每个实体的整数。当我稍后通过比较时间戳查询数据库时,我得到一个错误,如下所示:
Error: One of the request inputs is not valid.
RequestId:3b61f705-ca01-4742-981b-6e2332029874
Time:2013-12-06T16:49:42.0282802Z
经过大量调试后,我终于发现了发生了什么。在我的代码中,我有以下查询
var query = azure.TableQuery
.select()
.from(self.tableName)
.where('added gt ?', timestamp);
如果我将时间戳设置为Math.pow(2,30),一切似乎都很好,但是将它增加到Math.pow(2,31)会给我错误。我发现这种行为有点奇怪,因为Azure表存储类型中的是Int64类型。这基本上是利用它,我存储的值肯定比Int32大得多。
我最终解决了这个问题,方法是将值转换为DateTime,方法是在任何地方抛出新的Date(时间戳),但这应该是不必要的。任何人遇到这个,并设法将整数保存为整数?
答案 0 :(得分:1)
Azure Table Storage API Int64文字必须使用L后缀。
var query = new azure.TableQuery()
.where('loginTimeMS lt ?', 1406828512316);
query._where[0]+="L";
有效地将以下字符串放入表查询...
" loginTimeMS lt 1406828512316L"
注意最后的L.此查询将查找属性 loginTimeMS 小于1406828512316的实体,即 Int64 。
感觉就像一个解决方案 - 有兴趣听听是否有人找到了更优雅的解决方案。
答案 1 :(得分:0)
所以Javascript不支持传统方式的“整数”。请查看this answer on 64-bit integers。
可以精确编码所有高达2 ^ 53的正整数。较大的 整数将其最低有效位削减。这离开了 你怎么能在javascipt中表示64位整数的问题 - 原生数字数据类型显然不能精确地表示64位int。
现在超出了这个问题,你似乎在32位屏障上遇到了问题。你检查过你的node.js版本了吗?适用于Windows的节点同时包含32 & 64-bit flavors。
我怀疑您可能正在运行32位版本(x86)而不是64位版本(x64)。这可能会解决部分问题。
那说明,它不会解决上面的问题,因为你最终会遇到54位左右的问题。 Node.JS有several integer libraries available您可能需要使用。