Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 选择每天的特定时间范围_C#_Sql_Sql Server_Entity Framework_Linq - Fatal编程技术网

C# 选择每天的特定时间范围

C# 选择每天的特定时间范围,c#,sql,sql-server,entity-framework,linq,C#,Sql,Sql Server,Entity Framework,Linq,我有一个股票市场数据库,每5分钟存储一次商品的价格。 表中有以下列 身份证件 商品 时间 自年起,证券交易所从 星期五格林威治标准时间22.00至星期日格林威治标准时间22.00 因此,我需要从select查询中排除这些结果 是否有任何方法可以排除每个项目的数据 星期五格林威治标准时间22.00至星期日格林威治标准时间22.00 在查询中 因为,数据库的大小非常大,所以我避免使用游标或循环。我在应用程序中使用LINQ,试图找出一些棘手的SQL攻击,并对其进行选择查询。如果它实际上是datatim

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

身份证件 商品 时间 自年起,证券交易所从

星期五格林威治标准时间22.00至星期日格林威治标准时间22.00 因此,我需要从select查询中排除这些结果

是否有任何方法可以排除每个项目的数据

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

在查询中


因为,数据库的大小非常大,所以我避免使用游标或循环。我在应用程序中使用LINQ,试图找出一些棘手的SQL攻击,并对其进行选择查询。

如果它实际上是datatime,而不仅仅是Time,则不需要依赖于数据库类型和时间列数据

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

为什么不使用LINQ解决方案?在出现以下情况时,创建视图可能有助于提高数据库性能:

已正确结算索引

数据库是否可以自动改进视图执行计划

如果您使用的是物化视图,那么如果正确使用它,将极大地提高存储空间的成本

如果您在C中使用LINQ,并且假设您的时间是DateTime结构类型,并且位于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

我想时间是DateTime2类型的。您可以有一个标准,例如:

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对datetime具有特殊的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。

以下是基于和线程的LINQ到实体解决方案:


嗨,伊恩,我试过x.Time.DayOfWeek,但这不起作用,我们需要使用SQLFunctions来实现同样的功能。LINQ在x.Time.DayOfWeek上抛出一个错误,因为它没有转换成sql函数datepart。此时数据库上的数据类型是什么?是datetime吗?好的,您的解决方案必须使用LINQ吗?你是否认为你的数据库中有视图?如果在数据库级中考虑解决方案,可以在SQL Server中创建具有相同WHERE子句概念的视图来获取数据表,我想LINQ to EF将不起作用。使用linqtosql,需要更正表达式,周五和周日的表达式将是| |而不是&&。否则它会过滤掉所有。嗨,Cetin,我已经尝试了t.Time.DayOfWeek,但这是抛出错误,说LINQ to Entity中不支持'DayOfWeek'。。。。请提供帮助,但我已经说过,这不适用于Linq To EF。如果您想使用它,您需要使用它的datetime DbFunctions。我给出的代码适用于LINQtoSQL。还有EF,您可以直接使用SQL with.ExecuteQuery select。。。。
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;