Presto:仅在工作时间两个时间戳之间的时间差,以分钟为单位

问题描述 投票:0回答:1

我正在尝试查找两个日期之间以分钟为单位的时差,但是我希望该差额能说明商店营业的时间。商店每天仅开放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)

有办法吗?

postgresql datediff presto date-difference
1个回答
0
投票

好吧,我不知道您尝试的查询是什么,但是我做的不是,而是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);
© www.soinside.com 2019 - 2024. All rights reserved.