根据SQL SERVER中的时间可用性过滤表记录

时间:2018-07-12 11:54:38

标签: sql-server

我有一个表tblAvailability,其中有两列“ StartTime time”和“ EndTime time”。 在那里,我将StartTime = 7 AM设置为EndTime = 10。 现在我在前端有过滤器,可以发送时间范围,例如6到10或7:30到10 像这样。 我写了如下的SQL查询。

Where  CONVERT(varchar, StartTime, 108) >= CONVERT(varchar, @startTime, 108)
AND CONVERT(varchar, EndTime, 108) <= CONVERT(varchar, @endTime, 108)

现在,我想根据开始时间和结束时间范围来过滤掉行 想要获取其开始时间和结束时间范围在所选时间范围之间的所有记录表。 欢迎任何帮助。 谢谢你。

1 个答案:

答案 0 :(得分:0)

如上面的评论中所述,您不清楚您使用的是日期时间还是日期和时间。您能发布更多信息吗?

您应该注意,SQL Server中的日期类型和范围可能与C#等客户端语言有所不同(尽管您没有提及客户端语言)。例如,如果您使用的是SQL Server“ datetime”,则可以使用适当的类型(例如

)来限制C#中的客户端日期范围
System.Data.SqlDbType.DateTime

您说您已经编写了一个查询,以用于过滤某些数据,我认为您在SQL Server中运行该查询。

假设使用C#作为客户端,返回数据的有效方法是在SQL Server中编写一个View,并将其添加到Entity Framework模型中。要在客户端查询此数据,请使用LinqSQL,它将您的客户端代码转换为SQL并以惊人的效率运行。

var filteredData = (from i in _db.vw_SomeData where i.StartDate >= fromDate && i.EndDate < toDate select i).ToList()

请注意数据端点(包含值和排除值)。如果您使用SQL Server datetime,并且希望在一天内进行所有操作,那么我将使用(日期> =今天,日期<明天),保证可以正常工作。在最后一秒和午夜之间有时间的情况下,尝试用“小于或等于”对一天的最后一秒进行测试将不起作用。

总而言之,最好对这些类型进行本机比较日期和/或时间。仅在某些比较数据是字符串的情况下,才应将一个转换为另一个。唯一易于排序且可比的日期和时间是yyyymmdd和HHmmss