繁体   English   中英

在SQL Server中的2个日期之间,每年每个月每年的天数

[英]Number of day Count in every week in every month year wise between 2 dates in sql server

我需要获取两个日期之间的日期和天数值。

假设我们想获取7月1日至8月5日之间的记录。

输出应如下表图像所示:

我们已经知道,对于该日期范围,我们在7月的5个星期8月的1个星期

让我们从第一周到上周开始: 在此处输入图片说明

试试这个Goutam Singh。 我认为使用星期一作为一周的开始,daycount现在应该是7、2。

SELECT 
    [DYear],    
    [DMonth],   
    [Week], 
    DayCount=COUNT(DISTINCT DayCount),
    BillableHour=SUM(BillableHour)
FROM
(

    SELECT
        [DYear]=(YEAR(Workdate)) ,
        [DMonth]=(DATENAME(MONTH, Workdate)) , 
        DateNames=datename(dw, Workdate),
        [Week]='Week ' + CAST((DATEPART(wk,DATEADD(DAY, -1,Workdate)) - MAX(DATEPART(wk,DATEADD(DAY, -1,Workdate)) )over(partition by (select null))+2) AS varchar(20)), 
        DayCount= (  WorkDate),
        BillableHour=(Convert(DECIMAL(16,2),[Hours]))
    FROM
        @TempTable

    WHERE
        Workdate between CONVERT(datetime,@FromDate) and CONVERT(datetime,@ToDate)
)G
GROUP BY
    [DYear],    
    [DMonth],   
    [Week]

我不清楚一周中的天数。 否则,下面将是查询。 只需将值和日期列替换为适当的列名即可。 选择计数(值),月(日期),datepart(WEEKDAY,date())作为星期数,从t按日期分组

@Goutam Singh我这里有更新版本。 基本上,您需要CTE为查询构建模板表,然后根据要获取TotalHours的表中的内容进行联接。 让我知道您是否想要的。

DECLARE @StartDate DATE='20180101'
DECLARE @EndDate DATE='20180901'

DECLARE @Dates TABLE(
      Workdate DATE  Primary Key
)

 DECLARE @TempTable TABLE (Id INT, Hours real, WorkDate DATETIME )
 INSERT INTO @TempTable
 SELECT 1,   5,   '03.05.2018 00:00:00'  UNION ALL 
 SELECT 2,   1.5,   '08.05.2018 00:00:00'  UNION ALL 
 SELECT 3,   3,   '01.05.2018 00:00:00'  UNION ALL 
 SELECT 4,   0,   '04.05.2018 00:00:00'  UNION ALL 
 SELECT 5,   2,   '03.05.2018 00:00:00'  UNION ALL 
 SELECT 6,   4,   '03.05.2018 00:00:00'  UNION ALL 
 SELECT 7,   2,   '05.05.2018 00:00:00'  UNION ALL 
 SELECT 8,   0.5,   '08.05.2018 00:00:00'  UNION ALL 
 SELECT 9,   0,   '01.05.2018 00:00:00'  UNION ALL 
 SELECT 10,   6,   '08.05.2018 00:00:00'  UNION ALL 
 SELECT 11,   8,   '02.05.2018 00:00:00'  UNION ALL 
 SELECT 12,   3.5,   '09.05.2018 00:00:00'  UNION ALL 
 SELECT 13,   1,   '09.05.2018 00:00:00'  UNION ALL 
 SELECT 14,   4,   '04.05.2018 00:00:00'  UNION ALL 
 SELECT 15,   1,   '03.05.2018 00:00:00'  UNION ALL 
 SELECT 16,   0,   '02.05.2018 00:00:00'  UNION ALL 
 SELECT 17,   3,   '05.05.2018 00:00:00'  UNION ALL 
 SELECT 18,   0.5,   '04.05.2018 00:00:00'  UNION ALL 
 SELECT 19,   2,   '09.05.2018 00:00:00'  UNION ALL 
 SELECT 20,   0,   '09.05.2018 00:00:00' 


 --DATEADD(DAY, -1,Workdate)
;WITH Dates AS(
      SELECT Workdate=@StartDate,WorkMonth=DATENAME(MONTH,@StartDate),WorkYear=YEAR(@StartDate), WorkWeek=datename(wk, DateAdd(DAY,-1,@StartDate)   )
      UNION ALL
      SELECT CurrDate=DateAdd(DAY,1,Workdate),WorkMonth=DATENAME(MONTH,DateAdd(DAY,1,Workdate)),YEAR(DateAdd(DAY,1,Workdate)),datename(wk, Workdate) FROM Dates D WHERE Workdate<@EndDate ---AND (DATENAME(MONTH,D.Workdate))=(DATENAME(MONTH,D.Workdate))
)


SELECT 
    WorkMonth,  
    NumWeek=ROW_NUMBER()OVER(PARTITION BY WorkMonth+cast(WorkYear as varchar(20)) ORDER BY WorkdateStart),
    NumDayWeek,
    WorkYear,   
    WorkdateStart, 
    WorkdateEnd,  
    TotalHours=SUM(TotalHours)
FROM
(


SELECT 
    D.Workdate, 
    D.WorkMonth,    
    D.WorkYear,
    D.WorkWeek, 
    WorkdateStart=MIN(D.Workdate) over(partition by cast(WorkWeek as varchar(20))+workmonth+cast(WorkYear as varchar(20))),
    WorkdateEnd=MAX(D.Workdate) over(partition by cast(WorkWeek as varchar(20))+workmonth+cast(WorkYear as varchar(20))),
    NumDayWeek=datediff(day,MIN(D.Workdate) over(partition by cast(D.WorkWeek as varchar(20))+workmonth+cast(WorkYear as varchar(20))),MAX(D.Workdate) over(partition by cast(D.WorkWeek as varchar(20))+workmonth+cast(WorkYear as varchar(20))))+1,
    T.TotalHours,
    T.DayCount
FROM
    Dates D
    LEFT JOIN
        (
         SELECT T.WorkDate, TotalHours=sum(T.Hours), DayCount=sum(case when T.Hours>0 then 1 else 0 end) FROM 
         @TempTable T
         GROUP BY
         T.WorkDate
        )T ON
         T.WorkDate = D.Workdate    

)Sub



GROUP BY

    WorkMonth,  
    WorkYear,
    WorkdateStart, 
    NumDayWeek,
    WorkdateEnd
ORDER BY
WorkdateStart  

option (maxrecursion 0) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM