【问题标题】:Select specific time range on each day选择每天的特定时间范围
【发布时间】:2016-05-18 07:36:14
【问题描述】:

我有一个股票市场数据库,其中商品的价格每 5 分钟存储一次。 表格有以下几列

  • 身份证
  • 商品
  • 时间

因为,证券交易所从

  • 格林威治标准时间周五 22.00 至周日格林威治标准时间 22.00

所以,我需要从我的选择查询中排除这些结果。

有什么办法可以排除每个数据

格林威治标准时间周五 22.00 至周日格林威治标准时间 22.00

在查询中。

由于数据库非常大,所以我避免使用游标或循环。我在应用程序中使用 LINQ 并试图找出一些棘手的 SQL hack,并为其进行 Select 查询。

【问题讨论】:

    标签: c# sql sql-server entity-framework linq


    【解决方案1】:

    根据数据库类型和“时间”列数据,不需要任何技巧(如果它实际上是数据时间,而不是仅时间)

    您可以使用 SQl datepart 命令选择特定的工作日和小时部分,因此您可以将其包含在 WHERE 子句中

    为什么不使用 LINQ 解决方案 - 在

    的情况下,创建视图可能对数据库性能有益
    • 正确设置索引

    • 如果数据库可以自动改进视图执行计划

    • 如果您正在使用物化视图(如果正确使用它会大大提升,但会消耗一些存储空间)

    【讨论】:

      【解决方案2】:

      如果您在 C# 中使用 LINQ 并假设您的 TimeDateTime struct 类型并且在 GMT(或 UTC)时区,那么在 DataTable 集合项中,您可以使用Where 子句过滤给定的限制:

      var query = stocks
          .Where(x => x.Time.DayOfWeek != DayOfWeek.Saturday //not Saturday
          || !(x.Time.DayOfWeek != DayOfWeek.Friday && x.Time.Hour >= 22) //not Friday after 10PM
          || !(x.Time.DayOfWeek != DayOfWeek.Sunday && x.Time.Hour <= 22)); //not Sunday before 10PM
      

      【讨论】:

      • 嗨 Ian,我试过 x.Time.DayOfWeek,但这不起作用,我们需要使用 SQLFunctions。 LINQ 在 x.Time.DayOfWeek 上抛出错误,因为这不会转换为 sql 函数 datepart。
      • Time 的数据库中的数据类型是什么?现在是日期时间吗?
      • 好的,您的解决方案是否必须使用LINQ?您是否考虑在您的数据库中使用View?如果您考虑数据库级别的解决方案,您可以在 SQL 服务器中使用相同的Where 子句概念创建一个View 来获取您的数据表,我认为
      • 使用 Linq To EF 将无法正常工作。使用 Linq To SQL,需要更正表达式,它会是 ||不是 && 周五和周日。否则它将过滤掉所有内容。
      【解决方案3】:

      我猜时间是 DateTime(2) 类型。您可以有一个标准,例如:

      SELECT  *
      FROM    [MyTable]
      WHERE   ( ( DATEPART(dw, [Time]) + @@DATEFIRST + 6 ) % 7 <> 6
                AND ( ( DATEPART(dw, [Time]) + @@DATEFIRST + 6 ) % 7 <> 5
                      OR DATEPART(HOUR, [Time]) < 22
                    )
                AND ( ( DATEPART(dw, [Time]) + @@DATEFIRST + 6 ) % 7 <> 0
                      OR CAST([Time] AS TIME) >= '22:00'
                    )
              );
      

      使用 Linq To SQL(Linq To EF 对日期时间有特殊的 DbFunc):

      var ts = TimeSpan.FromHours(22);
      var data = db.MyTable
          .Where(t => t.Time.DayOfWeek != DayOfWeek.Saturday &&
          (t.Time.DayOfWeek != DayOfWeek.Friday || t.Time.TimeOfDay < ts) &&
          (t.Time.DayOfWeek != DayOfWeek.Sunday || t.Time.TimeOfDay >= ts));
      

      这将创建一个相似(但不相同)的 SQL。

      【讨论】:

      • 嗨 Cetin,我已经尝试过 t.Time.DayOfWeek,但这会引发错误,说 LINQ to Entity 不支持“DayOfWeek”......请帮助
      • 但是我已经说过这不适用于 Linq To EF(如果你想使用它,你需要使用它的 datetime DbFunctions 来解决)。我提供的代码适用于 Linq to SQL。并且还可以使用 EF 直接将 SQL 与 .ExecuteQuery("select ..."). 一起使用
      【解决方案4】:

      这是基于this postLinq query DateTime.Date.DayOfWeek 线程的LINQ to Entities 解决方案:

      var query = from stock in db.Stocks
                  let firstSunday = new DateTime(1753, 1, 7)
                  let dayOfWeek = (DayOfWeek)(DbFunctions.DiffDays(firstSunday, stock.Time).Value % 7)
                  let hour = stock.Time.Hour
                  where !((dayOfWeek == DayOfWeek.Friday && hour >= 22) ||
                          (dayOfWeek == DayOfWeek.Saturday) ||
                          (dayOfWeek == DayOfWeek.Sunday && hour < 22))
                  select stock;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-18
        • 1970-01-01
        相关资源
        最近更新 更多