【问题标题】:Showing selected daterange in SQL Server在 SQL Server 中显示选定的日期范围
【发布时间】:2020-02-26 10:25:17
【问题描述】:

我有一个报告工具,我需要以以下格式显示输出,

如果我选择开始日期时间为 2019-01-10 00:00:00,结束日期时间为 2019-05-20 00:00:00,

输出应该如下所示,

以下是我尝试过的查询,但我只得到开始日期范围或结束日期范围,但如果我们在过滤器中选择多个月份,我需要显示完整的月份日期范围

DECLARE @StartDate DateTIme
DECLARE @EndDate DateTime

SET @StartDate='2018-01-26 01:10:00'
SET @EndDate='2018-02-27 02:31:00'

;WITH GETMONTHPART(MonthNumber1,MonthNames1,StartDate,EndDate,StartDateMonth,EndDateMonth,DayRange)
AS
(

SELECT DATEPART(MM,@StartDate) MONTHNUMBER,DATENAME(MONTH,@StartDate) MONTH,@StartDate,@EndDate,CONVERT(VARCHAR(25),
DATEADD(dd,-(DAY(@StartDate)-1),@StartDate),101),
CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@EndDate))),DATEADD(mm,1,@EndDate)),101),
CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@StartDate)-1),@StartDate),101)+' - '+CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@StartDate))),DATEADD(mm,1,@StartDate)),101) [TotalDaysofMonth]
)
,

--SELECT * FROM GETMONTHPART

CALLSUMMARY (Monthnumber,Monthname,callednumbercount) AS
(
SELECT DATEPART(MM,ccd.startdatetime) MONTHNUMBER,
DATENAME(MONTH,ccd.startdatetime) MONTH,
COUNT(callednumber) FROM table ccd WHERE startdatetime>=@StartDate and startdatetime<@EndDate
GROUP BY DATEPART(MM,ccd.startdatetime),
DATENAME(MONTH,ccd.startdatetime)
)

Select MonthName,DayRange,callednumbercount from CALLSUMMARY, GETMONTHPART

ORDER BY Monthnumber,Monthname ASC

这是我目前得到的输出,因为 DateRange 转换仅对 @StartDateTime 进行,所以一月份的月份范围也将变为二月份。如果我们将其修改为@EndDateTime,则两个 DateRange 都将在 2 月到来。

希望这能澄清我的问题。

【问题讨论】:

    标签: sql-server common-table-expression dynamic-sql date-range


    【解决方案1】:

    我认为问题在于第一个 CTE 中的分组。你可以试试这样的:

    DECLARE @StartDate DateTIme
    DECLARE @EndDate DateTime
    
    SET @StartDate='2018-01-26 01:10:00'
    SET @EndDate='2018-05-27 02:31:00'
    
    ;with a as(
              select chatID
                     ,convert(date,c.datetmStart) dateChat 
              from factChat c 
              WHERE c.datetmStart >=@StartDate 
                    and c.datetmStart < @EndDate
             )
    
      select CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(dateChat)-1),dateChat),101) startDateMonth
            ,CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,dateChat))),DATEADD(mm,1,dateChat)),101) EndDateMonth
            ,CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(dateChat)-1),dateChat),101)+' - '+CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,dateChat))),DATEADD(mm,1,dateChat)),101) [DayRange]
            ,month(dateChat) monthNr
            ,count(chatID) totalChats
      from a
      group by CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(dateChat)-1),dateChat),101)
              ,CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,dateChat))),DATEADD(mm,1,dateChat)),101) 
              ,CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(dateChat)-1),dateChat),101)+' - '+CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,dateChat))),DATEADD(mm,1,dateChat)),101) 
              ,month(dateChat)
      order by month(dateChat)
    

    我使用了我的内部表 factChat,但我想你会明白的。

    运行查询后,我得到以下结果:

    【讨论】:

    • 您好,感谢您的查询,但这并不完全符合我的要求。它显示了开始日期时间的选定日期时间范围、结束日期时间的选定日期时间范围和 BETWEEN 月份的全月数据的数据。但我也需要开始和结束日期范围的全月日期。你能不能也让我高兴一下?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多