显示 SQL 服务器中的选定日期范围
Showing selected daterange in SQL Server
我有一个报告工具,我需要以下面的格式显示输出,
如果我 select 开始日期时间为 2019-01-10 00:00:00 结束日期时间为 2019-05-20 00:00:00,
输出应该如下所示,
下面是我试过的查询,但我只得到开始日期范围或结束日期范围,但如果我们 select 在过滤器中有多个月份,我需要显示完整的月份日期范围
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
这是目前我得到的输出,其中 1 月份的月份范围也将进入 2 月份,因为 DateRange 转换仅对 @StartDateTime 进行。如果我们将其修改为@EndDateTime,则两个 DateRange 都将在 Feb.
希望这能澄清我的问题。
我认为问题在于第一个 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)
我已经使用了我的内部 table factChat,但我想你会明白我的意思。
在 运行 查询之后,我得到以下结果:
我有一个报告工具,我需要以下面的格式显示输出,
如果我 select 开始日期时间为 2019-01-10 00:00:00 结束日期时间为 2019-05-20 00:00:00,
输出应该如下所示,
下面是我试过的查询,但我只得到开始日期范围或结束日期范围,但如果我们 select 在过滤器中有多个月份,我需要显示完整的月份日期范围
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
这是目前我得到的输出,其中 1 月份的月份范围也将进入 2 月份,因为 DateRange 转换仅对 @StartDateTime 进行。如果我们将其修改为@EndDateTime,则两个 DateRange 都将在 Feb.
希望这能澄清我的问题。
我认为问题在于第一个 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)
我已经使用了我的内部 table factChat,但我想你会明白我的意思。
在 运行 查询之后,我得到以下结果: