PostgreSQL中如何正确计算员工实际工作天数?
计算员工实际工作天数的正确方法
问题背景
数据集如下:
emp_id|emp_name|work_start_date|work_end_date|days_worked_on| ------+--------+---------------+-------------+--------------+ 1|A | 2023-03-01| 2023-03-03| 2| 2|B | 2023-03-04| 2023-03-04| 0|
最初使用的查询语句:
select emp_id ,emp_name ,work_start_date ,work_end_date ,work_end_date - work_start_date as days_worked_on from demo.stackquestions;
理想中员工A实际工作3天(2023-03-01至2023-03-03),但查询结果为2天;员工B当天工作,结果为0天,显然不符合预期。疑问是:是否应该使用 work_end_date - work_start_date +1 as days_worked_on 来得到正确天数?
解答
是的,这种方法是正确的。
日期相减得到的是两个日期之间的间隔天数,而非包含起止日期的总天数:
- 2023-03-03 - 2023-03-01 = 2,这是两个日期的间隔天数,但实际包含的工作日是3天(1号、2号、3号),加1正好补全起始日的计数。
- 员工B的情况中,2023-03-04 - 2023-03-04 = 0,加1后得到1,完全符合当天工作1天的实际情况。
需要注意边界场景:如果存在work_end_date早于work_start_date的无效数据,这种计算会得到错误结果,建议提前过滤这类数据,比如添加where work_end_date >= work_start_date条件。
内容的提问来源于stack exchange,提问作者Learn Hadoop
相关产品推荐
相关产品推荐

