我有下表:
CREATE TABLE dbo.Test
(
Name NVARCHAR(50)
,StartDate DATE
,EndDate DATE
)
INSERT INTO dbo.Test VALUES('ABC','28-Feb-14','03-Mar-14')
INSERT INTO dbo.Test VALUES('DEF','04-Mar-14','04-Mar-14')
基本上它包含给定用户的开始和结束日期。我期待输出如下所示。
预期产出:
Name | WorkHour| LeaveHour | Remarks
-------------------------------------
ABC | 27 | 18 | 28-Feb, 03-Mar
DEF | 36 | 9 | 04-Mar
休假1天对应9小时,工作周参考星期五至下周四。在这种情况下,将从2月28日至6月6日。
WorkHour
指的是用户工作的小时数,但不包括周末。
LeaveHour
是指用户休假的小时数。
'备注'是指用户在StartDate和EndDate值之间的不同叶子,它们应以逗号分隔。
我能够得到工作时间(包括不需要的周末),留下小时值,但发现很难有备注和价值,不包括周末
SELECT
RN.Name
,ISNULL(45 - ((DATEDIFF(DD, VT.StartDate, VT.EndDate) + 1) * 9 ), 0) AS 'WorkHours'
,ISNULL(((DATEDIFF(DD, VT.StartDate, VT.EndDate) + 1) * 9 ), 0) AS 'LeaveHours'
--distinct leave dates seperated by comma should be displayed as remarks
FROM
Test VT
LEFT JOIN
ResourceNames RN ON VT.UserId = RN.UserId
有人可以帮忙吗?
答案 0 :(得分:0)
这不应该在SQL中完成,但是这是一个可以执行您想要的功能:
create function CSVDates (@startDate datetime, @endDate datetime)
returns nvarchar(4000)
as
begin
declare @csv nvarchar(4000) = ''
declare @maxDays int = DATEDIFF(DD, @startDate, @endDate)
declare @count int = 0
declare @date datetime
while(@count <= @maxDays )
begin
if (DATENAME(dw, @date) = 'Saturday' OR DATENAME(dw, @date) = 'Sunday')
BEGIN
set @count = @count + 1
CONTINUE
END
set @date = DATEADD(d,@count, @startDate)
if (len(@csv) > 0) set @csv = @csv + ','
set @csv = @csv + DATENAME(day,@date) + '-' + DATENAME(month,@date)
set @count = @count + 1
end
return @csv
end
将其插入您的选择CSVDates(vt.StartDate, vt.EndDate)
如果你之间有很多日期,nvarchar(4000)可能还不够......
答案 1 :(得分:0)
我弄清楚出了什么问题,最后我有时间研究这个问题。基本上周末的块不允许日期增加,导致数据不出现。
以下是寻找类似问题的人的工作代码
create function CSVDates (@startDate datetime, @endDate datetime)
returns nvarchar(4000)
as
begin
declare @csv nvarchar(4000) = ''
declare @maxDays int = DATEDIFF(DD, @startDate, @endDate)
declare @count int = 0
--assign start date
declare @date datetime = @startDate
while(@count <= @maxDays )
begin
if (DATENAME(dw, @date) = 'Saturday' OR DATENAME(dw, @date) = 'Sunday')
begin
--do nothing
set @count =@count
end
else
begin
if (len(@csv) > 0)
set @csv = @csv + ','
set @csv = @csv + DATENAME(day,@date) + '-' + SUBSTRING(DATENAME(month,@date),1,3)
end
set @count = @count + 1
set @date = DATEADD(d,@count, @startDate)
end
return @csv
end