Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 计算两个日期之间的工作日数_Postgresql_Time Series_Plpgsql - Fatal编程技术网

Postgresql 计算两个日期之间的工作日数

Postgresql 计算两个日期之间的工作日数,postgresql,time-series,plpgsql,Postgresql,Time Series,Plpgsql,我正在尝试获取plpgsql中两个日期之间的工作日数。以下是我的代码: CREATE FUNCTION weekdays(DATE, DATE) RETURNS INTEGER AS $$ DECLARE d date := $1; weekdays integer := 0 BEGIN LOOP IF select extract(dow from date d) != 6 or select extract(dow from date d) != 0 w

我正在尝试获取plpgsql中两个日期之间的工作日数。以下是我的代码:

CREATE FUNCTION weekdays(DATE, DATE) RETURNS INTEGER AS
$$
DECLARE
    d date := $1;
    weekdays integer := 0
BEGIN

LOOP
    IF select extract(dow from date d) != 6 or select extract(dow from date d) != 0
      weekdays := weekdays +1
    END IF
    d := d + 1;
    EXIT WHEN d > $2;
END LOOP;
RETURN weekdays;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE;
但是,我不断遇到以下错误:


该错误是由于缺少一个;工作日后整数:=0;。再加上一些类似的错误。这将有助于:

但我建议改为使用更简单、更快的SQL函数:

大范围的性能可能会进一步提高。相关的:


该错误是由于缺少一个;工作日后整数:=0;。再加上一些类似的错误。这将有助于:

但我建议改为使用更简单、更快的SQL函数:

大范围的性能可能会进一步提高。相关的:


你不需要循环,答案可以通过算术找到

CREATE OR REPLACE FUNCTION public.weekdays(s date, e date) RETURNS integer
 LANGUAGE plpgsql
 IMMUTABLE
AS $function$
DECLARE
  sd int = extract (isodow from s-1); 
  ed int = extract (isodow from e); 
BEGIN
   RETURN - case sd when 7 then 5 when 6 then 5 else sd end 
          + case ed when 7 then 5 when 6 then 5 else ed end 
          + (e-ed-s+sd+1)/7*5;
END;
$function$;

你不需要循环,答案可以通过算术找到

CREATE OR REPLACE FUNCTION public.weekdays(s date, e date) RETURNS integer
 LANGUAGE plpgsql
 IMMUTABLE
AS $function$
DECLARE
  sd int = extract (isodow from s-1); 
  ed int = extract (isodow from e); 
BEGIN
   RETURN - case sd when 7 then 5 when 6 then 5 else sd end 
          + case ed when 7 then 5 when 6 then 5 else ed end 
          + (e-ed-s+sd+1)/7*5;
END;
$function$;

我没有得到那个错误信息。这似乎主要是一个算术问题;我没有得到那个错误信息。这似乎主要是一个算术问题;s应该是不需要计算的。
CREATE OR REPLACE FUNCTION weekdays_sql(date, date)
  RETURNS integer AS
$func$
SELECT count(*)::int
FROM   generate_series($1, $2, interval '1d') d
WHERE  extract(isodow FROM d) < 6;
$func$  LANGUAGE sql IMMUTABLE;
CREATE OR REPLACE FUNCTION public.weekdays(s date, e date) RETURNS integer
 LANGUAGE plpgsql
 IMMUTABLE
AS $function$
DECLARE
  sd int = extract (isodow from s-1); 
  ed int = extract (isodow from e); 
BEGIN
   RETURN - case sd when 7 then 5 when 6 then 5 else sd end 
          + case ed when 7 then 5 when 6 then 5 else ed end 
          + (e-ed-s+sd+1)/7*5;
END;
$function$;