我正在寻找将给定日期增加工作日数的功能。
假期表
create table pyha (pyha date primary key) ;
insert into pyha values ('2018-12-24'),('2018-12-25'),('2018-12-26'),('2019-01-01');
包含假期。另外,星期六和星期日均为非营业日。
我试图创建功能
create or replace function add_business_day(from_date date, num_days int)
returns date
as $fbd$
with days as
(
select dd, extract(DOW from dd) dw
from generate_series(($1+ interval'1day')::date, ($1+ interval'1day'*$2+interval'10days')::date , '1 day'::interval) dd
)
select min(dd)::date
from days
where dw not in (6,0) and
dd not in (select pyha from pyha)
and dd>=$1+interval'1day'*$2+
interval'1day'*(select count(*) from pyha where pyha between $1+ interval'1day' and
$1+interval'1day'*$2 )
$fbd$ language sql;
但是它有时返回不正确的结果:
add_business_day('2018-12-08',2)
返回2018-12-10,
但正确的结果是2018-12-11
如何在Postgres 9.1+中创建这样的功能?
关键是生成一系列工作日,并用row_number()
以下编号对它们进行编号:
create or replace function add_business_day(from_date date, num_days int)
returns date
as $fbd$
select d
from (
select d::date, row_number() over (order by d)
from generate_series(from_date+ 1, from_date+ num_days* 2+ 5, '1d') d
where
extract('dow' from d) not in (0, 6)
and d not in (select pyha from pyha)
) s
where row_number = num_days
$fbd$ language sql;
测试查询的结果似乎正确:
select days, add_business_day('2018-12-08', days)
from generate_series(1, 20) days
days | add_business_day
------+------------------
1 | 2018-12-10
2 | 2018-12-11
3 | 2018-12-12
4 | 2018-12-13
5 | 2018-12-14
6 | 2018-12-17
7 | 2018-12-18
8 | 2018-12-19
9 | 2018-12-20
10 | 2018-12-21
11 | 2018-12-27
12 | 2018-12-28
13 | 2018-12-31
14 | 2019-01-02
15 | 2019-01-03
16 | 2019-01-04
17 | 2019-01-07
18 | 2019-01-08
19 | 2019-01-09
20 | 2019-01-10
(20 rows)
或者,您可以在循环中找到日期:
create or replace function add_business_day_loop(from_date date, num_days int)
returns date
as $fbd$
begin
while num_days > 0 loop
from_date:= from_date+ 1;
while from_date in (select pyha from pyha) or extract('dow' from from_date) in (0, 6) loop
from_date:= from_date+ 1;
end loop;
num_days:= num_days- 1;
end loop;
return from_date;
end;
$fbd$ language plpgsql;
问题内容: 由于GWT不提供GregorianCalendar类,如何在客户端上进行日历操作? 我有一个日期,我想要一个日期,即几天之后。 例子: 问题答案: 更新了GWT 2.1的答案 编辑:此类的完全限定名称为com.google.gwt.user.datepicker.client.CalendarUtil。
问题内容: 我需要在JavaScript中将日期值增加一天。 例如,我的日期值为2019-09-11,我需要将第二天的日期存储在JavaScript变量中。 如何将日期增加一天? 问题答案: 为您提供三种选择: 1.仅使用JavaScript的对象(不使用库): 我以前对#1的回答是错误的(它增加了24小时,未能考虑到夏时制的过渡;CleverHuman指出,东部时区到2010年11月7日将失败)
问题内容: 我想在特定日期添加一天。我怎样才能做到这一点? 现在,我想在这一天添加一天。 问题答案: 给定一个,你有几种可能性: 解决方案1:你可以为此使用类: 解决方案2:由于该类的各种缺点,你应该认真考虑使用库。使用,你可以执行以下操作: 解决方案3:使用Java 8,你还可以使用新的JSR 310 API(受Joda-Time启发):
在这我得到飞跃
问题内容: 我想将天数添加到当前日期:我正在使用以下代码: 但是我没有得到适当的日期,而是得到了: 2592000 请提出建议。 问题答案: 这应该是 期望得到一个包含美国英语日期格式的字符串,并将尝试将该格式解析为相对于现在给出的时间戳的Unix时间戳(自1970年1月1日00:00:00UTC以来的秒数)。当前时间(如果未提供)。 而 返回一个字符串,该字符串根据给定的格式字符串使用给定的整数
我使用html5日期选择器,如[输入类型="日期"], 我只需要增加当前日期1.我的意思是只显示明天的日期和未来的日期,当前日期和以前的日期想要去禁用状态只显示未来的日期... 任何人请帮帮我。。 这是我的试用代码。 小提琴:代码在这里...