Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在日期之间存在重叠的情况下,如何限制日期差异的聚合_Sql_Sql Server_Date_Sql Server 2012_Aggregate - Fatal编程技术网

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