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

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)
时间: 2024-11-26 23:55:14

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

P使用strtotime计算两个给定日期之间天数的方法

 这篇文章主要介绍了PHP使用strtotime计算两个给定日期之间天数的方法,实例分析了php操作时间的技巧,非常具有实用价值,需要的朋友可以参考下     本文实例讲述了PHP使用strtotime计算两个给定日期之间天数的方法.分享给大家供大家参考.具体分析如下: PHP的strtotime函数用于将任何英文文本的日期时间描述解析为Unix时间戳.这个函数将使用TZ环境变量(如果有的话)来计算时间戳.如果执行成功它返回一个时间戳,否则返回FALSE.在PHP 5.1.0之前,这个函数将返回

PHP使用strtotime计算两个给定日期之间天数的方法_php技巧

本文实例讲述了PHP使用strtotime计算两个给定日期之间天数的方法.分享给大家供大家参考.具体分析如下: PHP的strtotime函数用于将任何英文文本的日期时间描述解析为Unix时间戳.这个函数将使用TZ环境变量(如果有的话)来计算时间戳.如果执行成功它返回一个时间戳,否则返回FALSE.在PHP 5.1.0之前,这个函数将返回-1. $date1 = date('Y-m-d'); $date2 = '2005-03-01′; $days = (strtotime() – strtot

使用IP地址在两个android手机之间如何通讯?

问题描述 使用IP地址在两个android手机之间如何通讯? 3g连接的基础上,能否可以分别查询200个android手机的IP地址? 能否直接使用IP 地址进行TCP通信吗? 希望大家给点建议,谢谢! 解决方案 直接P2P是不行的,因为移动上网时,是先连到运营商(如联通)的大局域网再通过网关转到公网,手机分配的IP是10.xx.xx.xx,并不是公网IP,你从外面查手机的IP都是运营商网关IP.而且两台手机也不一定在同一局域网段,也就不能保证直接互联能一定成功.解决办法还是像QQ一样,搞个服务

两台FortiGate设备之间设置IPSec动态DNS VPN

本文档针对IPsec VPN 中的动态DNS VPN 进行说明,即两台FortiGate设备之间通过VPN建立通信通道,让FortiGate保护的服务器或主机可以互相访问.其中一台FortiGate使用静态IP而另一台FortiGate使用静态域名和动态IP. 在配置之前需要统一VPN策略和参数,如模式.加密算法.认证方式.DH组.密钥周期.XAUTH和对NAT.DPD的支持等.其中模式.加密算法.认证方式.DH组必须一致,否则建不起来VPN. 环境介绍: 本文使用FortiGate400A和F

android代码布局-android 代码中设置控件的垂直居中和两个控件之间的距离。

问题描述 android 代码中设置控件的垂直居中和两个控件之间的距离. 因为数据是动态的 所以所有的控件和布局都是在java代码里面设置 怎样才能让一个控件垂直居中 还有两个控件之间的距离又是怎么设置的啊 求高手指点啊 最好能给点代码 我是新手 说的太笼统了 看不太懂 谢谢了 解决方案 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT,

传感器-两部Android手机之间通信方式

问题描述 两部Android手机之间通信方式 1.两部Android手机之间建立通信使用哪种方式较好? 2.建立通信之后,如何从其中一部手机获取另外一部手机的传感器信息? 解决方案 使用socket通讯 解决方案二: socket通信,蓝牙通信 解决方案三: Android组件之间的通信方式 解决方案四: BlueTooth或者IM

两个listbox互相之间相互移动

问题描述 两个listbox互相之间相互移动 两个listbox互相之间相互移动,分为全部移动,移动当前条目和全部还原三个功能的实现? 解决方案 http://www.cnblogs.com/greatverve/archive/2012/03/27/listbox-add-remove-up-down.html 解决方案二: 两个ListBox中的项互相移动及上下移动

javascript-js中两个for循环之间的传值问题

问题描述 js中两个for循环之间的传值问题 假设有两个for循环 var data=0; for(var a=0;a<9;a++){ data+=a; } 那么我在第二个for循环中怎么取得第一个for循环的值 for(var b=0;b<9;b++){ alert(data); data+=b; } 在第二个for循环中alert出来的都是0. 解决方案 两个循环在一个函数中么?直接写应该是可以的. 如果不在一个函数,第一个的data写在函数外面,定义成全局的. 解决方案二: 如果你是想第

c# winfrom 获取两个 时间控件的时间 然后生成这个时间段的时间 形成下来列表

问题描述 c# winfrom 获取两个 时间控件的时间 然后生成这个时间段的时间 形成下来列表 c# winfrom 获取两个时间控件的时间 然后生成这个时间段的时间 形成下来列表 这个下拉列表里面的时间就是这个时间段中的每一天(日期). 这个怎么来实现呢? 解决方案 放两个datepicker控件dtp1,dtp2,用 sql = string.Format("select * from table where 日期字段 between '{0}' and '{1}'", dtp1