Sql 显示带有空白字段的周日历
我正试图创建一份报告,列出一周内所有168小时的时间段,供人们注册。下面的查询列出了用户已填写的基本数据,但我希望看到未注册的插槽 提前谢谢Sql 显示带有空白字段的周日历,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正试图创建一份报告,列出一周内所有168小时的时间段,供人们注册。下面的查询列出了用户已填写的基本数据,但我希望看到未注册的插槽 提前谢谢 SELECT p.[FirstName] , p.[LastName] , ( SELECT TOP 1 [Value] FROM [AttributeValue] av INNER JOIN [Attribute] a ON a.[Id] = av.[AttributeId]
SELECT
p.[FirstName]
, p.[LastName]
, ( SELECT TOP 1 [Value]
FROM [AttributeValue] av
INNER JOIN [Attribute] a ON a.[Id] = av.[AttributeId]
AND a.[EntityTypeId] = 113
AND a.[EntityTypeQualifierColumn] = 'WorkflowTypeId'
AND a.[EntityTypeQualifierValue] = w.[WorkflowTypeId]
WHERE [EntityId] = w.[Id]
AND a.[Key] = 'DayOfTheWeek'
) AS [Day]
, (SELECT TOP 1 [Value]
FROM [AttributeValue] av
INNER JOIN [Attribute] a ON a.[Id] = av.[AttributeId]
AND a.[EntityTypeId] = 113
AND a.[EntityTypeQualifierColumn] = 'WorkflowTypeId'
AND a.[EntityTypeQualifierValue] = w.[WorkflowTypeId]
WHERE [EntityId] = w.[Id]
AND a.[Key] = 'Time'
) AS [Time]
FROM
[Workflow] w
INNER JOIN [PersonAlias] pa ON pa.Id = w.[InitiatorPersonAliasId]
INNER JOIN [Person] p ON p.[Id] = pa.[PersonId]
WHERE w.[WorkflowTypeId] = 1032
您可以构建一周中日期之间的所有时间,然后可以与当前查询进行左连接,以获取所有未使用的插槽
declare @startDate datetime ='2014-11-23'
declare @endDate datetime ='2014-11-30'
;with cte
as
(
your current query
)
, cte1
as
(
select datename(WEEKDAY, @startDate) as [day], datepart(hour, @startdate) as [time],
dateadd(hour, datediff(hour, 0, @startDate)+1, 0) as nextVal
union all
select datename(WEEKDAY, nextVal) as [day], datepart(hour, nextVal) as [time],
dateadd(hour, datediff(hour, 0, nextVal)+1, 0) as nextVal
from cte1
where nextVal<@endDate
)
select * from cte1
left join cte
on cte.day = cte1.day
and cte.time = cte1.time
OPTION (MAXRECURSION 168)
要获得所有不单独使用的插槽,可以添加cte.day为空的条件