Sql 在日期之间存在重叠的情况下,如何限制日期差异的聚合
如何在日期之间存在重叠的情况下限制日期差异的聚合 如果我有一个像这样的任务表:Sql 在日期之间存在重叠的情况下,如何限制日期差异的聚合,sql,sql-server,date,sql-server-2012,aggregate,Sql,Sql Server,Date,Sql Server 2012,Aggregate,如何在日期之间存在重叠的情况下限制日期差异的聚合 如果我有一个像这样的任务表: emp_num from_date to_date 1336 2017-02-07 00:00:00.000 2017-02-08 00:00:00.000 1336 2017-02-15 00:00:00.000 2017-02-16 00:00:00.000 1336 2017-02-21 00:00:00.0
emp_num from_date to_date
1336 2017-02-07 00:00:00.000 2017-02-08 00:00:00.000
1336 2017-02-15 00:00:00.000 2017-02-16 00:00:00.000
1336 2017-02-21 00:00:00.000 2017-02-23 00:00:00.000
1336 2017-02-26 00:00:00.000 2017-02-26 00:00:00.000
1336 2017-02-28 00:00:00.000 2017-03-01 00:00:00.000
我想得到一年中某个月(截止日期-自截止日期)的总和 在本例中,2017年2月的总任务天数应等于9天
我做了以下查询,但由于与下个月重叠,我得到的是
10
天,而不是9
天
SELECT b.emp_num,b.NAME AS FullName ,c.DEPTNAME AS DeptName,d.camp_name AS CampName
,SUM(DATEDIFF(day,a.from_date ,a.to_date)+1) AS Mission_SUM
FROM Mission a INNER JOIN Employee b
ON a.emp_num = b.emp_num
INNER JOIN DEPARTMENT c
ON b.dep_code = c.dep_code
INNER JOIN Branch d
ON d.camp_code = b.camp_code
where ((Year(from_date) =2017 AND Month(from_date)=2) OR (Year(to_date) =2017 AND Month(to_date)=2))
and mission_type = 1
GROUP BY b.emp_num,b.NAME,c.DEPTNAME,d.camp_name
ORDER BY d.camp_name,c.DEPTNAME,b.NAME
我想获得员工2017年2月的总天数?您可以使用此查询
DECLARE @FirstDate date = '2017-02-01'
DECLARE @EndDate date = EoMonth(@FirstDate)
SELECT b.emp_num,b.NAME AS FullName ,c.DEPTNAME AS DeptName,d.camp_name AS CampName
,SUM(DATEDIFF(day,
IIF(a.from_date > @FirstDate, a.from_date, @FirstDate) ,
IIF(a.to_date < @EndDate, a.to_date, @EndDate))+1) AS Mission_SUM
FROM Mission a INNER JOIN Employee b
ON a.emp_num = b.emp_num
INNER JOIN DEPARTMENT c
ON b.dep_code = c.dep_code
INNER JOIN Branch d
ON d.camp_code = b.camp_code
where ((Year(from_date) =2017 AND Month(from_date)=2) OR (Year(to_date) =2017 AND Month(to_date)=2))
and mission_type = 1
GROUP BY b.emp_num,b.NAME,c.DEPTNAME,d.camp_name
ORDER BY d.camp_name,c.DEPTNAME,b.NAME
DECLARE@FirstDate日期='2017-02-01'
声明@EndDate date=EoMonth(@FirstDate)
选择b.emp_num,b.NAME作为全名,c.DEPTNAME作为DEPTNAME,d.camp_NAME作为CampName
,SUM(DATEDIFF)(日),
IIF(a.from_date>@FirstDate,a.from_date,@FirstDate),
IIF(a.截止日期<@EndDate,a.截止日期,@EndDate))+1)作为任务总和
从任务a内部加入员工b
在a.emp_num=b.emp_num上
内部连接部门c
在b.dep_代码=c.dep_代码上
内连接分支d
关于d.camp_代码=b.camp_代码
式中((年(自日期)=2017年,月(自日期)=2)或(年(至日期)=2017年,月(至日期)=2))
任务类型=1
按b.emp_num、b.NAME、c.DEPTNAME、d.camp_NAME分组
按d.营地名称、c.部门名称、b.名称订购
您可以使用此查询
DECLARE @FirstDate date = '2017-02-01'
DECLARE @EndDate date = EoMonth(@FirstDate)
SELECT b.emp_num,b.NAME AS FullName ,c.DEPTNAME AS DeptName,d.camp_name AS CampName
,SUM(DATEDIFF(day,
IIF(a.from_date > @FirstDate, a.from_date, @FirstDate) ,
IIF(a.to_date < @EndDate, a.to_date, @EndDate))+1) AS Mission_SUM
FROM Mission a INNER JOIN Employee b
ON a.emp_num = b.emp_num
INNER JOIN DEPARTMENT c
ON b.dep_code = c.dep_code
INNER JOIN Branch d
ON d.camp_code = b.camp_code
where ((Year(from_date) =2017 AND Month(from_date)=2) OR (Year(to_date) =2017 AND Month(to_date)=2))
and mission_type = 1
GROUP BY b.emp_num,b.NAME,c.DEPTNAME,d.camp_name
ORDER BY d.camp_name,c.DEPTNAME,b.NAME
DECLARE@FirstDate日期='2017-02-01'
声明@EndDate date=EoMonth(@FirstDate)
选择b.emp_num,b.NAME作为全名,c.DEPTNAME作为DEPTNAME,d.camp_NAME作为CampName
,SUM(DATEDIFF)(日),
IIF(a.from_date>@FirstDate,a.from_date,@FirstDate),
IIF(a.截止日期<@EndDate,a.截止日期,@EndDate))+1)作为任务总和
从任务a内部加入员工b
在a.emp_num=b.emp_num上
内部连接部门c
在b.dep_代码=c.dep_代码上
内连接分支d
关于d.camp_代码=b.camp_代码
式中((年(自日期)=2017年,月(自日期)=2)或(年(至日期)=2017年,月(至日期)=2))
任务类型=1
按b.emp_num、b.NAME、c.DEPTNAME、d.camp_NAME分组
按d.营地名称、c.部门名称、b.名称订购
我不太了解您,但我认为您需要了解到目前为止的差异,因此我创建了一个函数来计算年-月-日,并返回一个表,以便您可以选择所需的值
您可以更新它以获得所需的结果,也可以向我寻求帮助以获得正确的结果:
CREATE FUNCTION [dbo].[GetDateDifferenceInYearsMonthsDays]
(
@FromDate DATETIME, @ToDate DATETIME
)
RETURNS
@DateDifference TABLE (
YEAR INT, MONTH INT, DAYS INT)
AS
BEGIN
DECLARE @Years INT, @Months INT, @Days INT, @tmpFromDate DATETIME = @FromDate
SET @Years = DATEDIFF(yy, @tmpFromDate, @ToDate) - CASE WHEN (MONTH(@FromDate) > MONTH(@ToDate)) OR (MONTH(@FromDate) = MONTH(@ToDate) AND DAY(@FromDate) > DAY(@ToDate)) THEN 1 ELSE 0 END
SET @tmpFromDate = DATEADD(YEAR, @Years , @FromDate)
SET @Months = DATEDIFF(m, @tmpFromDate, @ToDate) - CASE WHEN DAY(@FromDate) > DAY(@ToDate) THEN 1 ELSE 0 END
SET @tmpFromDate = DATEADD(MONTH, @Months , @tmpFromDate)
SET @Days = DATEDIFF(d, @tmpFromDate, @ToDate)
INSERT INTO @DateDifference
VALUES(@Years, @Months, @Days)
RETURN
END
我的意思是,我不太理解你,但我认为你需要得到到目前为止的差异,所以我创建了一个函数来计算今年的月日,它返回一个表,这样你就可以选择你想要的值 您可以更新它以获得所需的结果,也可以向我寻求帮助以获得正确的结果:
CREATE FUNCTION [dbo].[GetDateDifferenceInYearsMonthsDays]
(
@FromDate DATETIME, @ToDate DATETIME
)
RETURNS
@DateDifference TABLE (
YEAR INT, MONTH INT, DAYS INT)
AS
BEGIN
DECLARE @Years INT, @Months INT, @Days INT, @tmpFromDate DATETIME = @FromDate
SET @Years = DATEDIFF(yy, @tmpFromDate, @ToDate) - CASE WHEN (MONTH(@FromDate) > MONTH(@ToDate)) OR (MONTH(@FromDate) = MONTH(@ToDate) AND DAY(@FromDate) > DAY(@ToDate)) THEN 1 ELSE 0 END
SET @tmpFromDate = DATEADD(YEAR, @Years , @FromDate)
SET @Months = DATEDIFF(m, @tmpFromDate, @ToDate) - CASE WHEN DAY(@FromDate) > DAY(@ToDate) THEN 1 ELSE 0 END
SET @tmpFromDate = DATEADD(MONTH, @Months , @tmpFromDate)
SET @Days = DATEDIFF(d, @tmpFromDate, @ToDate)
INSERT INTO @DateDifference
VALUES(@Years, @Months, @Days)
RETURN
END
实现这一点的简单方法如下所示。希望它涵盖所有场景。我只考虑了日期
CREATE TABLE #TMP (FROMDATE DATE, ENDDATE DATE)
INSERT INTO #TMP VALUES('2017-02-07','2017-02-08')
INSERT INTO #TMP VALUES('2017-02-15','2017-02-16')
INSERT INTO #TMP VALUES('2017-02-21','2017-02-23')
INSERT INTO #TMP VALUES('2017-02-26','2017-02-26')
INSERT INTO #TMP VALUES('2017-02-28','2017-03-01')
SELECT SUM(TOTALDAYS) TOTALDAYS
FROM (
SELECT TOTALDAYS=
CASE WHEN MONTH(FROMDATE)=MONTH(ENDDATE) AND YEAR(FROMDATE)=YEAR(ENDDATE) THEN SUM(DATEDIFF(D,FROMDATE,ENDDATE))+COUNT(1)
WHEN MONTH(FROMDATE)!=MONTH(ENDDATE) THEN SUM(DATEDIFF(D,FROMDATE,EOMONTH(FROMDATE)))+1
END
FROM #TMP
GROUP BY FROMDATE,ENDDATE
) A
DROP TABLE #TMP
实现这一点的简单方法如下所示。希望它涵盖所有场景。我只考虑了日期
CREATE TABLE #TMP (FROMDATE DATE, ENDDATE DATE)
INSERT INTO #TMP VALUES('2017-02-07','2017-02-08')
INSERT INTO #TMP VALUES('2017-02-15','2017-02-16')
INSERT INTO #TMP VALUES('2017-02-21','2017-02-23')
INSERT INTO #TMP VALUES('2017-02-26','2017-02-26')
INSERT INTO #TMP VALUES('2017-02-28','2017-03-01')
SELECT SUM(TOTALDAYS) TOTALDAYS
FROM (
SELECT TOTALDAYS=
CASE WHEN MONTH(FROMDATE)=MONTH(ENDDATE) AND YEAR(FROMDATE)=YEAR(ENDDATE) THEN SUM(DATEDIFF(D,FROMDATE,ENDDATE))+COUNT(1)
WHEN MONTH(FROMDATE)!=MONTH(ENDDATE) THEN SUM(DATEDIFF(D,FROMDATE,EOMONTH(FROMDATE)))+1
END
FROM #TMP
GROUP BY FROMDATE,ENDDATE
) A
DROP TABLE #TMP