2017-07-12 16 views
0

私は従業員の仕事経験を持つテーブルを持っています。私はyy mm ddのような形式で要約の経験を得たいです。従業員合計の経験SQLクエリ

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 

が正常に動作しますが、何日については?

+1

何かがここで少しオフに私には思えます。週末、休日、休暇はどうですか? –

+0

[年月日を返すためにDATEDIFFを使用するにはどうすればいいですか?](https://stackoverflow.com/questions/1541570/how-to-use-datediff-to-return-year-month-and-day ) –

+0

これは包括的ですか? 2行目のwork_toと3行目のwork_fromは1日離れているため、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 
+0

これは13Y、8M、1Dの結果を返します。 1Dは間違っていますが、27日間のOPもそうです。 –

+0

今すぐチェックしてください。 – Ryan

+0

私は上記のクエリを編集しました。今は正しいと思います。私はテストのための日付の行から計算するだけで、いくつかではないので、うまくいけばあなたのテーブルからあなたの総和がうまくいけばうまくいきます。私は作業を確認するのに役立つ合計日数を含めました。 – Ryan

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 [email protected] ddD'), '@', 'M') 
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)' 
関連する問題