PostgreSQL 如何计算两个时间点之间正常的工作日时间

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
云数据库 RDS SQL Server,基础系列 2核4GB
简介: create or replace function minus_weekend(timestamp, timestamp) returns interval as $$ declare s timestamp := $1; e timestamp := $2; sd date;
create or replace function minus_weekend(timestamp, timestamp) returns interval as 
$$

declare
  s timestamp := $1;
  e timestamp := $2;
  sd date;
  ed date;
  i interval := interval '0';
  x int;
  x1 interval;
  x2 interval;
begin
  if e < s then
    s := $2;
    e := $1;
  end if;

  select case when extract(isodow from s) not in (6,7) then date(s+interval '1 day')-s else interval '0' end, 
         case when extract(isodow from e) not in (6,7) then e-date(e) else interval '0' end
  into x1, x2;

  if date(e)-date(s) = 0 then
    if extract(isodow from s) not in (6,7) then
      return e-s;
    else 
      return interval '0';
    end if;
  elsif date(e)-date(s) = 1 then
    return x1 + x2;
  end if;

  sd := date(s)+1;
  ed := date(e);

  for x in 0..(ed-sd-1) loop
    if extract(isodow from sd+x) not in (6,7) then 
      i := i + interval '1 day';
    end if;
  end loop;

  return i+x1+x2;
end;

$$
 language plpgsql strict;

例子:

postgres=> create table tbl(username name, begin_time timestamp, end_time timestamp);
CREATE TABLE
postgres=> insert into tbl values ('a','2012-10-28 08:30','2012-11-05 17:30');
INSERT 0 1
postgres=> insert into tbl values ('b','2012-11-02 08:30', '2012-11-07 13:30');
INSERT 0 1
postgres=> insert into tbl values ('a','2012-11-08 13:30', '2012-11-09 17:30');
INSERT 0 1

计算a用户实际工作时间。

postgres=> select minus_weekend(begin_time,end_time),username from tbl where username='a';
  minus_weekend  | username 
-----------------+----------
 5 days 17:30:00 | a
 28:00:00        | a
(2 rows)

postgres=> select sum(minus_weekend(begin_time,end_time)) from tbl where username='a' ;
       sum       
-----------------
 5 days 45:30:00
(1 row)
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
弹性计算 网络协议 容灾
PostgreSQL 时间点恢复(PITR)在异步流复制主从模式下,如何避免主备切换后PITR恢复(备库、容灾节点、只读节点)走错时间线(timeline , history , partial , restore_command , recovery.conf)
标签 PostgreSQL , 恢复 , 时间点恢复 , PITR , restore_command , recovery.conf , partial , history , 任意时间点恢复 , timeline , 时间线 背景 政治正确非常重要,对于数据库来说亦如此,一个基于流复制的HA架构的集群,如果还有一堆只读节点,当HA集群发生了主备切换后,这些只读节点能否与新的主节点保持
1817 0
|
3月前
|
存储 关系型数据库 Serverless
PostgreSQL计算两个点之间的距离
PostgreSQL计算两个点之间的距离
338 60
|
关系型数据库 PostgreSQL
PostgreSQL 计算字符串字符数函数(CHAR_LENGTH(str))和字符串长度函数(LENGTH(str))
PostgreSQL 计算字符串字符数函数(CHAR_LENGTH(str))和字符串长度函数(LENGTH(str))
2093 0
|
7月前
|
SQL 关系型数据库 C语言
PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享
PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享
96 0
|
弹性计算 容灾 关系型数据库
PostgreSQL PITR 任意时间点恢复过程中如何手工得到recovery需要的下一个WAL文件名 - 默认情况下restore_command自动获取
标签 PostgreSQL , recovery , recovery.conf , restore_command , timeline , 时间线 , next wal , PITR , 时间点恢复 背景 PostgreSQL数据库支持PITR时间点恢复。默认情况下,只需要配置目标是时间点,resotre_command即可,PG会自动调用resotre_command去找需要的WA
1513 0
|
关系型数据库 大数据 测试技术
AnalyticDB PostgreSQL 7.0 新能力介绍 : 利用JIT加速计算
AnalyticDB PostgreSQL 7.0 发布, 即时编译(Just-In-Time,JIT)可以将某种形式的解释程序计算转变成原生程序,由CPU原生执行,从而得到加速。
283 0
AnalyticDB PostgreSQL 7.0 新能力介绍 : 利用JIT加速计算
|
关系型数据库 PostgreSQL 运维
PostgreSQL的时间/日期函数使用
PostgreSQL的常用时间函数使用整理如下: 一、获取系统时间函数 1.1 获取当前完整时间 select now(); david=# select now(); now ------------------------------- 2013-04-12 15:39:40.399711+08 (1 row) david=# current_timestamp 同 now() 函数等效。
1072 0
|
关系型数据库 测试技术 数据库
PostgreSQL pg_rewind,时间线修复,脑裂修复,flashback - 从库开启读写后,回退为只读从库。异步主从发生角色切换后,主库rewind为新主库的从库
PostgreSQL pg_rewind,时间线修复,脑裂修复,flashback - 从库开启读写后,回退为只读从库。异步主从发生角色切换后,主库rewind为新主库的从库
2175 1
|
SQL Oracle 关系型数据库
PostgreSQL pg_rewind,时间线修复,脑裂修复,flashback - 从库开启读写后,回退为只读从库。异步主从发生角色切换后,主库rewind为新主库的从库
标签 PostgreSQL , pg_rewind , 主从切换 , 时间线修复 , 脑裂修复 , 从库开启读写后,回退为只读从库 , 异步主从发生角色切换后,主库rewind为新主库的从库 背景 1、PG物理流复制的从库,当激活后,可以开启读写,使用pg_rewind可以将从库回退为只读从库的角色。而不需要重建整个从库。 2、当异步主从发生角色切换后,主库的wal目录中可能还有没完全
1123 0

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版