C# 如何在C中从cosmos db获取最新5分钟的精确数据#

C# 如何在C中从cosmos db获取最新5分钟的精确数据#,c#,.net,c#-4.0,azure-cosmosdb,C#,.net,C# 4.0,Azure Cosmosdb,我有一个webjob,它可以连续运行并从WebSocket api读取数据 下面是每1秒自动运行的代码,并将勾号数据添加到cosmos db中 private static void OnTick(Tick TickData) { var latestTickData = new MyObject() { InstrumentID = TickData.InstrumentToken,

我有一个webjob,它可以连续运行并从WebSocket api读取数据

下面是每1秒自动运行的代码,并将勾号数据添加到cosmos db中

private static void OnTick(Tick TickData)
        {

            var latestTickData = new MyObject()
            {
                InstrumentID = TickData.InstrumentToken,
                Close = TickData.LastPrice,
                High = TickData.LastPrice,
                Low = TickData.LastPrice,
                Open = TickData.LastPrice,
                TimeStamp = TickData.Timestamp.HasValue ? TickData.Timestamp.Value : DateTime.Now
            };

            // add data into cosmos

            Task.Run(() =>
            {
                Program.documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri("tickerDatabase", "tickerContainer"), latestTickData);
            }).Wait();
        }
现在我想读取最近5分钟的数据,并获取打开-高-低-关闭值

对于最近的5分钟数据,目前我每5分钟运行一次计时器作业,从cosmos读取数据并计算开-高-低-关,但问题是这里的时间

如果计时器作业晚运行1分钟,则该数据的窗口也将更改,并获取错误的值

我的问题是,如何从宇宙获取精确的5分钟最新数据

当前计时器作业代码-

myobject.cs

public class MyObject
    {
        public uint InstrumentID { get; set; }
        public decimal Close { get; set; }
        public decimal High { get; set; }
        public decimal Low { get; set; }
        public decimal Open { get; set; }
        public DateTime TimeStamp { get; set; }
        public uint Volume { get; set; }

        public DateTime GetStartOfPeriodByMins(int numMinutes)
        {
            int oldMinutes = TimeStamp.Minute;
            int newMinutes = (oldMinutes / numMinutes) * numMinutes;

            DateTime startOfPeriod = new DateTime(TimeStamp.Year, TimeStamp.Month, TimeStamp.Day, TimeStamp.Hour, newMinutes, 0);

            return startOfPeriod;
        }
    }
myfunction.cs

public static void ExecuteProcess([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer)
        {
            var option = new FeedOptions { EnableCrossPartitionQuery = true };
            var queryable = Program.documentClient.CreateDocumentQuery<MyObject>
            (UriFactory.CreateDocumentCollectionUri("tickerDatabase", "tickerContainer"), option).ToList();


            var resultSet = queryable.GroupBy(i => i.GetStartOfPeriodByMins(5))
               .Select(gr =>
              new
              {
                  StartOfPeriod = gr.Key,
                  Low = gr.Min(item => item.Low),
                  High = gr.Max(item => item.High),
                  Open = gr.OrderBy(item => item.TimeStamp).First().Open,
                  Close = gr.OrderBy(item => item.TimeStamp).Last().Close
              });

            var my5min = resultSet.LastOrDefault();

            Console.WriteLine("time " + my5min.StartOfPeriod + " open " + my5min.Open + " high " + my5min.High + " low " + my5min.Low + " close " + my5min.Close);
public static void ExecuteProcess([TimerTrigger(“0*/5****”)TimerInfo myTimer)
{
var option=newfeedoptions{EnableCrossPartitionQuery=true};
var queryable=Program.documentClient.CreateDocumentQuery
(UriFactory.CreateDocumentCollectionUri(“tickerDatabase”、“tickerContainer”)选项);
var resultSet=queryable.GroupBy(i=>i.GetStartOfPeriodByMins(5))
.选择(gr=>
新的
{
StartOfPeriod=组键,
低=gr.Min(项目=>项目低),
高=gr.Max(项目=>项目高),
Open=gr.OrderBy(item=>item.TimeStamp).First().Open,
Close=gr.OrderBy(item=>item.TimeStamp).Last().Close
});
var my5min=resultSet.LastOrDefault();
控制台写入线(“时间”+my5min.StartOfPeriod+“打开”+my5min.open+“高”+my5min.high+“低”+my5min.low+“关闭”+my5min.close);
让我用1分钟的数据来解释这个问题(虽然我最初想要5分钟)

以下是样本记录-

List<MyObject> test = new List<MyObject>();
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 01) });
            test.Add(new MyObject() { Open = 2933, High = 2933, Low = 2933, Close = 2933, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 01) });
            test.Add(new MyObject() { Open = 2936, High = 2936, Low = 2936, Close = 2936, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 03) });
            test.Add(new MyObject() { Open = 2944, High = 2944, Low = 2944, Close = 2944, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 05) });
            test.Add(new MyObject() { Open = 2944, High = 2944, Low = 2944, Close = 2944, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 08) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 10) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 15) });
            test.Add(new MyObject() { Open = 2932, High = 2932, Low = 2932, Close = 2932, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 25) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 26) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 28) });
            test.Add(new MyObject() { Open = 2932, High = 2932, Low = 2932, Close = 2932, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 30) });
            test.Add(new MyObject() { Open = 2941, High = 2941, Low = 2941, Close = 2941, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 32) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 35) });
            test.Add(new MyObject() { Open = 2941, High = 2941, Low = 2941, Close = 2941, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 40) });
            test.Add(new MyObject() { Open = 2937, High = 2937, Low = 2937, Close = 2937, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 42) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 45) });
            test.Add(new MyObject() { Open = 2937, High = 2937, Low = 2937, Close = 2937, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 48) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 50) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 52) });
            test.Add(new MyObject() { Open = 2937, High = 2937, Low = 2937, Close = 2937, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 54) });
            test.Add(new MyObject() { Open = 2935, High = 2935, Low = 2935, Close = 2935, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 56) });

            test.Add(new MyObject() { Open = 2935, High = 2935, Low = 2935, Close = 2935, TimeStamp = new DateTime(2020, 10, 15, 10, 02, 12) });
List test=newlist();
Add(newmyobject(){Open=2939,High=2939,Low=2939,Close=2939,TimeStamp=newdatetime(2020,10,15,10,01,01)});
Add(newmyobject(){Open=2933,High=2933,Low=2933,Close=2933,TimeStamp=newdatetime(2020,10,15,10,01,01)});
Add(newmyobject(){Open=2936,High=2936,Low=2936,Close=2936,TimeStamp=newdatetime(2020,10,15,10,01,03)});
Add(newmyobject(){Open=2944,High=2944,Low=2944,Close=2944,TimeStamp=newdatetime(2020,10,15,10,01,05)});
Add(newmyobject(){Open=2944,High=2944,Low=2944,Close=2944,TimeStamp=newdatetime(2020,10,15,10,01,08)});
Add(newmyobject(){Open=2939,High=2939,Low=2939,Close=2939,TimeStamp=newdatetime(2020,10,15,10,01,10)});
Add(newmyobject(){Open=2939,High=2939,Low=2939,Close=2939,TimeStamp=newdatetime(2020,10,15,10,01,15)});
Add(newmyobject(){Open=2932,High=2932,Low=2932,Close=2932,TimeStamp=newdatetime(2020,10,15,10,01,25)});
Add(newmyobject(){Open=2939,High=2939,Low=2939,Close=2939,TimeStamp=newdatetime(2020,10,15,10,01,26)});
Add(newmyobject(){Open=2939,High=2939,Low=2939,Close=2939,TimeStamp=newdatetime(2020,10,15,10,01,28)});
Add(newmyobject(){Open=2932,High=2932,Low=2932,Close=2932,TimeStamp=newdatetime(2020,10,15,10,01,30)});
Add(newmyobject(){Open=2941,High=2941,Low=2941,Close=2941,TimeStamp=newdatetime(2020,10,15,10,01,32)});
Add(newmyobject(){Open=2939,High=2939,Low=2939,Close=2939,TimeStamp=newdatetime(2020,10,15,10,01,35)});
Add(newmyobject(){Open=2941,High=2941,Low=2941,Close=2941,TimeStamp=newdatetime(2020,10,15,10,01,40)});
Add(newmyobject(){Open=2937,High=2937,Low=2937,Close=2937,TimeStamp=newdatetime(2020,10,15,10,01,42)});
Add(newmyobject(){Open=2939,High=2939,Low=2939,Close=2939,TimeStamp=newdatetime(2020,10,15,10,01,45)});
Add(newmyobject(){Open=2937,High=2937,Low=2937,Close=2937,TimeStamp=newdatetime(2020,10,15,10,01,48)});
Add(newmyobject(){Open=2939,High=2939,Low=2939,Close=2939,TimeStamp=newdatetime(2020,10,15,10,01,50)});
Add(newmyobject(){Open=2939,High=2939,Low=2939,Close=2939,TimeStamp=newdatetime(2020,10,15,10,01,52)});
Add(newmyobject(){Open=2937,High=2937,Low=2937,Close=2937,TimeStamp=newdatetime(2020,10,15,10,01,54)});
Add(newmyobject(){Open=2935,High=2935,Low=2935,Close=2935,TimeStamp=newdatetime(2020,10,15,10,01,56)});
Add(newmyobject(){Open=2935,High=2935,Low=2935,Close=2935,TimeStamp=newdatetime(2020,10,15,10,02,12)});
作为GetStartTofPeriodByMins(1)的参数已过1分钟-

这里记录的是时间10:1:56和10:2:12

现在您可以观察最后一个,我们将在resultSet中获得2个记录集

若定时器触发功能未在特定时间运行,则仅取最后一条记录10:2:12的平均值,这是不正确的

所以问题是如何匹配运行时间

同样的情况也会发生在5分钟内

输出上述样本数据1分钟


因此,我们需要确保数据在该时间段内是完整的。

这里一个可能的解决方案是利用文档的
\ts
属性。您可以在5分钟内直接使用
开始日期
结束日期
进行SQL查询。此外,您还可以将
开始日期
保存为
上次使用的日期nd日期
单位为分贝(负)
SELECT * FROM c where c._ts <= 1601890740 AND c._ts >= 1601890585