日期间隔计算

时间:2017-09-16 22:35:45

标签: mysql date sql-view

我有一个包含开始日期和结束日期的行列表,例如公司的人员。

例如:

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整年等。我有每个员工的开始和结束日期,以及单独的日期列表(如果需要)。

1 个答案:

答案 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 |
+-------------+------------+------------+-------+