以逗号分隔的特定日期之间的日期

时间:2014-03-04 12:44:22

标签: sql-server-2008 tsql

我有下表:

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

有人可以帮忙吗?

2 个答案:

答案 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