我正在尝试查找两个日期之间以分钟为单位的时差,但是我希望该差额能说明商店营业的时间。商店每天仅开放9个小时,且仅在工作日开放(周末也关闭),因此时差应考虑营业时间中的时间。
示例:7/18/2019 9:50 AM-7/22/2019 10:02 AM
SELECT date_diff('minute', date_parse('7/18/2019 9:50:00 AM','%m/%d/%Y %h:%i:%s %p'), date_parse('7/22/2019 10:02:00 AM','%m/%d/%Y %h:%i:%s %p'))
这给出的答案是5772。但是我希望答案是1092。
excel公式是
A1 = 7/18/2019 9:50 AM
B1 = 7/22/2019 10:02 AM
if(OR(A1="",A1="NULL",B1="",B1="NULL"),"",(A1-B1)*24*60 - (days(A1,B1)+1-NETWORKDAYS(A1,B1))*24*60 - (NETWORKDAYS(A1,B1)-1)*15*60)
有办法吗?
好吧,我不知道您尝试的查询是什么,但是我做的不是,而是Postgres。 Postgres没有date_diff或date_parse函数,也不支持格式说明符%m /%d / ...(SQL Server?)。查看Excel语句,其中包含您的语句不尝试容纳的宏:NETWORKDAYS。该宏返回指定数据周期内的星期六,星期日和节假日数。在Postgres中,整个事情可以转换成一个SQL语句(几乎可以)。在下面的代码中,我将该语句包装在一个返回所需值的SQL函数中,但是测试用例1永远不够。另外,我还包括一个SQL函数,如果一天是假日,则返回一个布尔值(否则为true)。但是目前不知道您的假期总是返回false。
-- Holiday Routine
create or replace function Is_Holiday(date_in timestamp)
returns boolean
language sql
as $$
-- TODO: determine if parameter is a holiday. if so return true
select false;
$$;
--- Main Routine
create or replace function Work_Minuets_in_Period(date1_in timestamp, date2_in timestamp)
returns integer
language sql strict
as $$
with proper_dates as
( select least (date1_in,date2_in) start_date, greatest(date1_in, date2_in) end_date)
, date_interval as (select end_date - start_date intv from proper_dates)
, non_work_days as
(select count(*)::double precision non_work -- for operation with extract( ... ) function
from (select generate_series
( start_date
, end_date
, interval '1 day'
) this_day
from proper_dates ) ds
where extract(isodow from this_day ) in (6,7) -- sat, sun
or is_holiday(this_day) -- holiday?
)
select (9*60*(extract(days from intv) - non_work) -- full work days (9 hr each)
+ 60*extract(hours from intv) -- partial hours from interval
+ extract(minutes from intv) )::integer -- minuets
from date_interval, non_work_days;
$$;
--- test (calling function)
select * from Work_Minuets_in_Period('7/22/2019 10:02 AM'::timestamp ,'7/18/2019 9:50 AM'::timestamp);