我有一个包含开始日期和结束日期的行列表,例如公司的人员。
例如:
id start_date end_date
1 2010-01-01 2014-04-05
2 2008-06-07 2009-12-29
3 2012-04-04 2016-01-01
4 2010-05-06 2013-03-03
5 2009-04-04 2011-02-01
6 2006-01-01 2009-08-01
我想要做的是了解每一年都在公司工作的人数。因此,例如在2009-07-01,有一个人在那里待了3年(id = 6),一个人在那里1年(id = 2),一个人在那里0年(id = 5)
我打算创建一个视图,以便我有一个带有计数的日期列表,因为我想用它作为创建图形的基础。我在另一张表中列出了一个日期列表,我想用它来获取每个日期的公司人数(按年份划分)。
示例输出:
date 0year 1year 2year 3year
2009-12-28 1 1 0 0
2009-12-29 1 1 0 0
2009-12-30 1 0 0 0
2009-12-31 1 0 0 0
2010-01-01 2 0 0 0
2010-01-02 2 0 0 0
...
我有一个公式来计算给定日期(下面)的间隔,但我不知道如何为日期表中的每一行执行此操作,或者我如何将所有年份计数加在一起图。
SELECT
count(DATE_FORMAT(if('2010-01-01'<end_date,'2010-01-01',ifnull(end_date,'2010-01-01')), '%Y') - DATE_FORMAT(start_date, '%Y') - (DATE_FORMAT(if('2010-01-01'<end_date,'2010-01-01',ifnull(end_date,'2010-01-01')), '00-%m-%d') < DATE_FORMAT(start_date, '00-%m-%d')))
AS interval
FROM people
WHERE (DATE_FORMAT(if('2010-01-01'<end_date,'2010-01-01',ifnull(end_date,'2010-01-01')), '%Y') - DATE_FORMAT(start_date, '%Y') - (DATE_FORMAT(if('2010-01-01'<end_date,'2010-01-01',ifnull(end_date,'2010-01-01')), '00-%m-%d') < DATE_FORMAT(start_date, '00-%m-%d')))=1
编辑:尝试澄清我的要求:我想在任何一天创建一个视图来查看 该公司有多少员工已经工作了整整0年,1年,2整年等。我有每个员工的开始和结束日期,以及单独的日期列表(如果需要)。
答案 0 :(得分:1)
这有帮助吗?
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(employee_id INT NOT NULL
,start_date DATE NOT NULL
,end_date DATE NOT NULL
);
INSERT INTO my_table VALUES
(1,'2010-01-01','2014-04-05'),
(2,'2008-06-07','2009-12-29'),
(3,'2012-04-04','2016-01-01'),
(4,'2010-05-06','2013-03-03'),
(5,'2009-04-04','2011-02-01'),
(6,'2006-01-01','2009-08-01');
SELECT *
, FLOOR(DATEDIFF(LEAST('2009-07-01',end_date),start_date)/365.25) years
FROM my_table
WHERE '2009-07-07' > start_date;
+-------------+------------+------------+-------+
| employee_id | start_date | end_date | years |
+-------------+------------+------------+-------+
| 2 | 2008-06-07 | 2009-12-29 | 1 |
| 5 | 2009-04-04 | 2011-02-01 | 0 |
| 6 | 2006-01-01 | 2009-08-01 | 3 |
+-------------+------------+------------+-------+