我正在使用Document DB存储过程将基于遥测时间的数据检索到我的C#Web应用程序中。我的收藏中有1000份文件。我想基于Date Time对象进行计算。我想根据时间间隔获取所有文档。使用SQL查询我得到最近24小时记录的结果。
SqlQuerySpec query = new SqlQuerySpec("SELECT * FROM c where (c.logdatetime between '" + DateTime.Now.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ssZ") + "' and '" + DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ") + "')");
我想使用存储过程编写相同的查询。如何在存储过程中执行此操作。提前谢谢。
答案 0 :(得分:1)
首先:我建议您不要对格式化的DateTime字符串执行查询。将值存储为“ticks”(自纪元以来的秒或毫秒,也称为Unix时间)。
当前时间刻度:
// C#
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
// JavaScript
new Date().value
如果你想回到24小时,只需减去当时的等效刻度。 24 * 60 * 60 * 1000
其次:至少摆脱时区。只有一个时区,您的实现似乎非常可靠。永远。您的编写客户端和CosmosDB服务器需要在相同的时区运行,保证。请使用DateTime.UtcNow而不是DateTime.Now。或DateTimeOffset。
(如果您在将数据写入CosmosDB之前未手动调用ToString,则已经规定了时区,请参阅Creating and comparing dates inside CosmosDB stored procedures)
// C#
DateTimeOffset.UtcNow.ToString("s");
// JavaScript
new Date().toISOString();
这是一个示例存储过程:
function simple(prefix) {
var collection = getContext().getCollection();
var isAccepted = collection.queryDocuments(
collection.getSelfLink(),
'SELECT * FROM root r',
function (err, feed, options) {
...
});
}
感觉您正在尝试询问如何将代码转换为JavaScript。
SqlQuerySpec query = new SqlQuerySpec("SELECT * FROM c where
(c.logdatetime between '" + DateTime.Now.AddDays(-1)
.ToString("yyyy-MM-ddTHH:mm:ssZ") + "' and '" + DateTime.Now
.ToString("yyyy-MM-ddTHH:mm:ssZ") + "')");
使用ticks会是这样的:
var now = new Date().value;
var yesterday = now - 24 * 60 * 60 * 1000;
var query = "SELECT * FROM c where (c.logdatetime between '" + yesterday + "' and '" + now + "')"
如果你需要保留字符串:
var now = new Date();
var yesterday = new Date(now.value - 24 * 60 * 60 * 1000);
var query = "SELECT * FROM c where (c.logdatetime between '" + yesterday.toISOString() + "' and '" + now.toISOString() + "')"
当夏令时发挥作用时,不确定这种行为有多完美,但如果这对你来说至关重要,你应该找到足够的资源。
答案 1 :(得分:-1)