簡體   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