员工总体验SQL查询

时间:2017-07-12 19:03:48

标签: sql sql-server

我有员工工作经验。我想以yy mm dd。

等格式获得总结经验
e_id    work_from   work_to
2       2003-10-13  2004-02-12 
2       2004-02-16  2004-06-30 
2       2004-07-01  2006-01-31 
2       2006-02-01  2017-07-12 

结果应为:13Y 8M 27D

查询如下:

sum(datediff(month,work_from,work_to))/12,
sum(datediff(month,work_from,work_to)%12

工作正常,但几天呢?

3 个答案:

答案 0 :(得分:0)

请注意,以下查询是一般性总结,其中不包括闰年,并且由于每个月的天数变化,月平均在365/12天之间。如果你想要一个包含确切天数的确切数字,那么算法会更加复杂,但希望这会让你处于一个相当接近的大概数字。

SELECT  CONVERT(VARCHAR(10), sum(datediff(year,work_from,work_to))-1) + 'Y' AS Years,
        CONVERT(VARCHAR(10), FLOOR((sum(datediff(day, work_from,work_to)) - ((sum(datediff(year,work_from,work_to)) - 1) * 365)) / 30.4166)) + 'M' AS Months,
        CONVERT(VARCHAR(10), CEILING(sum(datediff(day, work_from,work_to)) - ((sum(datediff(year,work_from,work_to)) - 1) * 365) - (FLOOR((sum(datediff(day, work_from,work_to)) - ((sum(datediff(year,work_from,work_to)) - 1) * 365)) / 30.4166) * 30.4166))) + 'D' AS Days,
        CONVERT(VARCHAR(10), sum(datediff(day,work_from,work_to))) AS Total_Days

答案 1 :(得分:0)

这是我的解决方案。这是我能得到的最接近的。我遇到的问题是我不能在月之后逃过M。

DECLARE @SumExp Datetime = (SELECT CONCAT(
DATENAME(day, (SELECT SUM(DATEDIFF(day, WorkFrom, WorkTo))
    FROM EmployeeWorkExperience)),
DATENAME(month, (SELECT SUM(DATEDIFF(day, WorkFrom, WorkTo))
    FROM EmployeeWorkExperience)),
DATENAME(year, (SELECT SUM(DATEDIFF(day, WorkFrom, WorkTo))
    FROM EmployeeWorkExperience))))
SELECT REPLACE(FORMAT(@SumExp, 'yyY MM@ ddD'), '@', 'M')

答案 2 :(得分:0)

DECLARE  @work TABLE(
WorkId INT IDENTITY(1,1) PRIMARY KEY ,
work_from DATETIME NOT NULL,
work_to DATETIME NOT NULL   )


    INSERT INTO @work
        ( work_from, work_to )
    VALUES  ( '10/13/2003',
          '2/12/2004'
          ),
          (
          '2/16/2004',
          '6/30/2004'
          ),
          ('7/1/2004',
          '1/31/2006'
          ),
          ('2/1/2006',
          '7/12/2017'
          )

DECLARE @seconds int

SELECT @seconds =  SUM(DATEDIFF(SECOND, work_from, work_to))
FROM @work 
DECLARE @VARDT DATETIME = DATEADD(SECOND, @seconds, 0)


SELECT CAST(DATEPART(YEAR, @VARDT) - 1900 AS VARCHAR(10)) + ' year(s) ' + CAST(DATEPART(MONTH, @VARDT) - 1 AS VARCHAR(2)) + ' month(s) '
+ CAST(DATEPART(DD, @VARDT) - 1 AS VARCHAR(2)) + ' day(s) ' + CAST(DATEPART(HOUR, @VARDT) AS VARCHAR(2)) + ' hour(s) '
+ CAST(DATEPART(MINUTE, @VARDT) AS VARCHAR(2)) + ' minute(s) ' + CAST(DATEPART(SECOND, @VARDT) AS VARCHAR(2)) + ' second(s)'