Postgresql 计算两个日期之间的工作日数
我正在尝试获取plpgsql中两个日期之间的工作日数。以下是我的代码: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
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$;