我不确定在MSSQL中是否可以这样做。我有一个Timesheets表,我希望用户能够输入日期范围并查看该范围的所有时间表。需要注意的是,我还希望他们查看“缺失”的时间表。
用户每周都会进入Timesheet程序并创建一个时间表。当他们完成输入时间后,他们提交时间表,然后他们的直线经理将批准时间表(这是相关的,请耐心等待。)
我遇到的问题是,如果他们从未创建给定周的时间表。我似乎无法让它出来。我有以下查询,它会告诉我用户是否没有为给定范围创建时间表,但如果有说,在给定范围内有3周,并且那些星期有1个时间表,则不会报告说有两个“缺失”的时间表。
SELECT U1.Name, T.EndDate,
CASE T.Submitted
WHEN 1 THEN 'Yes'
ELSE 'No'
END AS Submitted,
CASE T.Approved
WHEN 1 THEN 'Yes'
ELSE 'No'
END AS Approved
FROM Users U1
LEFT OUTER JOIN Timesheets T ON U1.idUser = T.id_User AND (T.EndDate <= '2014-10-24' AND T.EndDate >= '2014-10-03')
WHERE U1.Active = 1
ORDER BY U1.Name
从技术上讲,这两个日期将是参数,我只是将它们包含在内联中以使事情变得更容易。是否有可能做我想做的事情?
答案 0 :(得分:1)
有许多技巧可以实现这一点,我最喜欢的是数字或计数表。您可以快速轻松地制作一个样本中的一个(示例中每个限制为5个)或谷歌周围更具创意的方式来列出一些数字。
花哨的递归cte
WITH tally ( n ) AS (
SELECT 1 UNION ALL
SELECT 1 + n FROM tally WHERE n < 5 )
SELECT n FROM tally
和内部sys表中的一个
SELECT number
FROM master..spt_values v
WHERE type = 'P' and number <= 5
您可以使用数字列表加入或应用,这样您就可以获得无间隙的范围。
这篇文章解释了使用计数器创建日期范围,应该让您入门。 link!
答案 1 :(得分:0)
select
u.name,
t.enddate,
case t.submitted
when 1 then 'yes'
else 'no'
end as submitted,
case t.approved
when 1 then 'yes'
else 'no'
end as approved
from
timesheets t
cross join
users u on
u.iduser = t.id_user
where
t.enddate <= '2014-10-24'
and t.enddate >= '2014-10-03'
and u.active = 1