【问题标题】:Query to extract data based upon time stamp conditions查询以根据时间戳条件提取数据
【发布时间】:2018-04-26 08:00:10
【问题描述】:

我正在构建一个 c# 应用程序,它必须读取以下格式的数据。

Column1 Column2 Column3 时间戳
   10 20 30 2017-04-25 14:15:00.000
   12 30 40 2017-04-25 14:15:15.000
   55 54 89 2017-04-25 14:15:30.000
   66 78 11 2017-04-25 14:15:45.000
   12 30 40 2017-04-25 14:16:00.000
   55 54 89 2017-04-25 14:16:15.000
   66 78 11 2017-04-25 14:16:30.000

时间戳的格式是

yyyy-mm-dd hh:mm:ss

每 15 秒记录一次数据。因此,任何连续两行的时间戳之间的差异应该是 15 秒。

例如:假设我要读取满足以下时间戳条件的 IN 列 3 值。

  1. 时间戳差异 (TimeDiff)
  2. 上限时间戳(TimeUpper)
  3. 下限时间戳(TimeLower)

    TimeDiff >= 30 秒 TimeUpper = 2017-04-25 14:16:30.000 TimeLower = 2017-04-25 14:15:30.000

输出应该是这样的

Column3
 89

整个想法是从数据库中提取数据点的特定时间窗口(两个时间戳之间),我可以在其中使用 Timediff 作为控制参数来调整读取的值。

我知道我可以在 SQL Server 中使用 CTE 来实现此逻辑,但我对 C# LINQ to SQL 感到迷茫。

如何在 C# 中编写逻辑?使用 LINQ

任何建议,想法都会很有帮助

提前谢谢你。

【问题讨论】:

  • 你能提供一些示例输出吗?
  • @qxg 刚刚编辑了我的问题,谢谢。
  • 我在这里真的没有看到问题。这看起来像一个简单的Where x < y and y < x + 30 seconds。你的问题到底是什么?到目前为止,您只说明了您想做什么。
  • @Marco Logic 很简单。但就像我提到的,我迷失在将它放入 c# 程序中。
  • 那么开始编码,当你遇到障碍时,在这里发布一个具体的问题。如果您不提供代码,我们将无法为您提供帮助。

标签: c# sql-server linq


【解决方案1】:
        string delimiter = ",";

        string sTimeUpper = "2017-04-25 14:16:30.000";
        string sTimeLower = "2017-04-25 14:15:30.000";

        DateTime TimeUpper = DateTime.Parse(sTimeUpper);
        DateTime TimeLower = DateTime.Parse(sTimeLower);

        Console.WriteLine($"TimeLower = {TimeLower}");
        Console.WriteLine($"TimeUpper = {TimeUpper}");

        List<string> res = (File.ReadAllLines(@"TimeStamp.txt")
            .Skip(1)
            .Select(line => line.Split(delimiter.ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
            .Where(fields => DateTime.Parse(fields[3]) > TimeLower && DateTime.Parse(fields[3]) < TimeUpper)
            .Select(fields => string.Join(",", fields))
            .ToList<string>());

        Console.WriteLine("Requested readings:");

        foreach (string item in res)
        {
            Console.WriteLine(item);
        }

【讨论】:

  • @Agni 我想你可以继续这个例子。数据文件“TimeStamp.TXT”与您在列之间使用连接空格和逗号分隔符完全相同。
【解决方案2】:

解决方案取决于您的需要。我的是这样的 如果时间戳列已经是 DateTime 格式,那么您可以使用

int secondDiff = 30;
DateTime timeUpper = DateTime.Parse("2017-04-25 14:16:30.000");
DateTime timeLower = DateTime.Parse("2017-04-25 14:15:30.000");

List<string> results = yourContext.TableName.AsEnumerable()
    .Where(t => t.TimeStamp.AddSeconds(secondDiff) <= timeUpper && 
        t.TimeStamp.AddSeconds(-secondDiff) >= timeLower);
    .Select(t => t.Column3).ToList();
// Output is { 89 }

【讨论】:

    猜你喜欢
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 2015-09-03
    • 2017-01-04
    • 2022-01-25
    相关资源
    最近更新 更多