SQL Server查询以根据计划获取可用员工

SQL Server查询以根据计划获取可用员工,sql,sql-server,database,Sql,Sql Server,Database,我有两个表,父表Employees和子表Employees\u Availability,如下所示: 员工表: 员工计划表: 如何创建一个查询,在给定的日期/时间和组中返回第一个可用的员工?我正在使用SQL Server 2012。以下是我开始做但被卡住的事情: Select top 1 Name from Empolyees e join? Employees_Schedule s on e.employeesID = s.EmployeesID where

我有两个表,父表Employees和子表Employees\u Availability,如下所示:

员工表:

员工计划表:

如何创建一个查询,在给定的日期/时间和组中返回第一个可用的员工?我正在使用SQL Server 2012。以下是我开始做但被卡住的事情:

Select top 1 
    Name 
from 
    Empolyees e join? Employees_Schedule s 
on
    e.employeesID = s.EmployeesID 
where
    e.group = 'Sales' 
    and DATENAME(Weekday,'5/24/2016 10:00') = s.Day 
    and CAST('5/24/2016 10:00' AS TIME) 'hh:mm' >= CAST(s.from AS TIME)
    and CAST('5/24/2016 10:00' AS TIME) 'hh:mm' <= CAST(s.to AS TIME)
order by 
    e.availability_order  

谢谢

您查看过车窗功能和CTE了吗?你可以很容易地做到这一点,例如

Row_Number() OVER(PARTITION BY day ORDER BY starttime ASC) as ColumnName
结合谓词

其中columnName=1和groupName='groupName'


有关详细信息,请阅读有关超限的BOL和CTE

您是否查看过窗口功能和CTE?你可以很容易地做到这一点,例如

Row_Number() OVER(PARTITION BY day ORDER BY starttime ASC) as ColumnName
结合谓词

其中columnName=1和groupName='groupName'


有关详细信息,请阅读有关超限的BOL和CTE

看来你们很接近了。如果将SQL的主要部分包装在中并使用,则可以找到第一个可用的:

;with cte as (
 Select top 1 
     Name,
     row_number() over (order by ea.From) PrioritySequence
 from 
     Empolyees e join? Employees_Schedule s 
 on
     e.employeesID = s.EmployeesID 
 where
     e.group = 'Sales' 
     and DATENAME(Weekday,'5/24/2016 10:00') = s.Day 
     and CAST('5/24/2016 10:00' AS TIME) 'hh:mm' >= CAST(s.from AS TIME)
     and CAST('5/24/2016 10:00' AS TIME) 'hh:mm' <= CAST(s.to AS TIME)
)
select *
  from cte
 where PrioritySequence = 1

看起来你很接近了。如果将SQL的主要部分包装在中并使用,则可以找到第一个可用的:

;with cte as (
 Select top 1 
     Name,
     row_number() over (order by ea.From) PrioritySequence
 from 
     Empolyees e join? Employees_Schedule s 
 on
     e.employeesID = s.EmployeesID 
 where
     e.group = 'Sales' 
     and DATENAME(Weekday,'5/24/2016 10:00') = s.Day 
     and CAST('5/24/2016 10:00' AS TIME) 'hh:mm' >= CAST(s.from AS TIME)
     and CAST('5/24/2016 10:00' AS TIME) 'hh:mm' <= CAST(s.to AS TIME)
)
select *
  from cte
 where PrioritySequence = 1

时间是如何存储在from和to中的?那些是瓦查尔吗?还有,为什么要在这里加上“2016年5月24日10:00”?为什么不仅仅是s.day='Monday'和s.from<'10:00'和s.to>'10:00'的位置?“5/24/2016 10:00”这句话会从一个变量或什么东西进入这个话题吗?是的,from和to是varchar。日期只是一个示例,我可以根据需要在查询中替换它或使用getdate—20多年前,在ANSI-92 SQL标准中,旧样式的逗号分隔表列表样式被正确的ANSI连接语法替换,因此不鼓励使用它。我将编辑。时间如何存储在“从”和“到”中?那些是瓦查尔吗?还有,为什么要在这里加上“2016年5月24日10:00”?为什么不仅仅是s.day='Monday'和s.from<'10:00'和s.to>'10:00'的位置?“5/24/2016 10:00”这句话会从一个变量或什么东西进入这个话题吗?是的,from和to是varchar。日期只是一个示例,我可以根据需要在查询中替换它或使用getdate—20多年前,在ANSI-92 SQL标准中,旧样式的逗号分隔表列表样式被正确的ANSI连接语法替换,因此不鼓励使用它。我会编辑。