2014-03-04 66 views
0

我有如下表:获取日期逗号分隔

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日至3月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 

谁能帮助困难吗?

+1

也许这将帮助你:http://stackoverflow.com/questions/252519/count-work-days-between-two-dates – Boklucius

+0

作品完美。备注栏怎么样?有关获取它的任何提示? – VKarthik

+0

在另一个表中没有注释(通过用户ID加入) – Boklucius

回答

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)可能是不够的...

+0

谢谢。简单而优雅。不知道我是如何错过的。 – VKarthik

+0

这对于2014-04-11和2014-04-15给出的startdatetime和enddatetime不起作用。任何想法,我哪里错了? – VKarthik

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 [email protected] 
    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