【问题标题】:Employee Total Experience SQL query员工总体验 SQL 查询
【发布时间】:2017-07-13 22:28:35
【问题描述】:

我有员工工作经验的表。我想以 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

工作正常,但几天呢?

【问题讨论】:

  • 这里对我来说似乎有点不对劲。周末、节假日、假期呢?
  • 这包括吗?第 2 行的 work_to 和第 3 行的 work_from 相隔 1 天是否意味着错过了 0 天?

标签: sql sql-server


【解决方案1】:

请注意,以下查询是不包括闰年的一般总和,并且由于每个月的天数不同,月份的平均天数在 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

【讨论】:

  • 这将返回 13Y、8M、1D 的结果。 1D 是不正确的,尽管 27 天的 OP 也是如此。
  • 我刚刚编辑了上面的查询。我认为现在是正确的。我只是从一排日期计算而不是几个,所以希望当你从你的表中得到你的总和时它会起作用。我包括了帮助我检查工作的总天数。
【解决方案2】:

这是我的解决方案。这是我能得到的最接近的。我遇到的问题是一个月后我无法逃脱 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')

【讨论】:

    【解决方案3】:
    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)'
    

    【讨论】:

      猜你喜欢
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 2016-08-02
      • 2023-03-21
      • 2021-01-25
      • 1970-01-01
      • 2020-08-21
      相关资源
      最近更新 更多