C# 选择每天的特定时间范围
我有一个股票市场数据库,每5分钟存储一次商品的价格。 表中有以下列 身份证件 商品 时间 自年起,证券交易所从 星期五格林威治标准时间22.00至星期日格林威治标准时间22.00 因此,我需要从select查询中排除这些结果 是否有任何方法可以排除每个项目的数据 星期五格林威治标准时间22.00至星期日格林威治标准时间22.00 在查询中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
因为,数据库的大小非常大,所以我避免使用游标或循环。我在应用程序中使用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;