Azure文档数据库存储过程DateTime查询

时间:2017-12-11 09:39:49

标签: c# azure azure-cosmosdb

我正在使用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") + "')");

我想使用存储过程编写相同的查询。如何在存储过程中执行此操作。提前谢谢。

2 个答案:

答案 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();

这是一个示例存储过程:

https://github.com/Azure/azure-documentdb-js-server/blob/master/samples/stored-procedures/SimpleScript.js

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)

相关问题