Sql 如何将参数传递到日期函数中
我试图创建一个简单的函数,但似乎无法将参数传入日期函数。Sql 如何将参数传递到日期函数中,sql,postgresql,parameter-passing,plpgsql,date-arithmetic,Sql,Postgresql,Parameter Passing,Plpgsql,Date Arithmetic,我试图创建一个简单的函数,但似乎无法将参数传入日期函数。 以下是函数: CREATE OR REPLACE FUNCTION test(source int,days text) RETURNS integer AS $totals$ declare totals integer; BEGIN select count(id) into totals from ad where createdate::date = dat
以下是函数:
CREATE OR REPLACE FUNCTION test(source int,days text)
RETURNS integer AS $totals$
declare
totals integer;
BEGIN
select
count(id) into totals
from ad
where
createdate::date = date(current_date - interval '$2' day) and
source = $1;
RETURN totals;
END;
$totals$ LANGUAGE plpgsql;
这是无效语法:
interval'$2'day
。在运行SQL之前,不仅要将变量交换到位,还需要将正确的值传递给函数
您可能想将字符串'day'
连接到字符串(text
)变量$2
,也称为days
(不是字面字符串'2'
)。所以$2 | |天“
或天| |天”
因为这不是一个单独的文本,所以您需要一个显式强制转换,而不仅仅是一个类型标签,所以类似于cast($2 | |“day”作为interval)
或(days | |“day”)::interval
已经揭示了您的语法错误。但是,这可以通过多种方式变得更简单、更快和更干净
CREATE OR REPLACE FUNCTION test(_source int, _days int)
RETURNS integer AS
$func$
SELECT count(*)::int
FROM ad a
WHERE a.source = $1
AND a.createdate::date = current_date - $2
$func$ LANGUAGE sql STABLE;
- 首先,要从
日期中减去天数,您可以减去
整数。因此,我在这里使用一个
参数integer
- 对于这样一个简单的函数,您不需要plpgsql。改用SQL函数——它可以在更大的查询上下文中“内联”,因此在某些情况下可以更好地优化
- 该功能可以是稳定的:
- 您的函数中内置了命名冲突
显然也是一个列名。尽量避免这样。通常的做法是在变量和参数前面加下划线(除此之外没有特殊含义)。您还可以使用函数名(或使用位置参数)对列名和/或前置参数名进行表限定,使其明确无误。我在这里都做了source
- 假设
是您的PK列,因此定义了id
,notnull
与count(*)
做的相同,稍微短一点,也便宜一点。我强制转换为count(id)
,因为count()将返回一个integer
bigint
createdate
实际上不是日期
,而是时间戳
(问题中缺少基本表定义)。在这种情况下,以不同的方式表达查询更有效:
CREATE OR REPLACE FUNCTION test(_source int, _days int)
RETURNS integer AS
$func$
SELECT count(*)::int
FROM ad a
WHERE a.source = $1
AND a.createdate >= now() - interval '1 day' * $2
AND a.createdate < now() - interval '1 day' * ($2 - 1)
$func$ LANGUAGE sql STABLE;
创建或替换功能测试(\u source int,\u days int)
将整数返回为
$func$
选择计数(*)::int
从公元前
其中a.source=$1
和a.createdate>=now()-间隔“1天”*$2
和a.createdate
- 此表达式更简单,因此更有效。它还可以在
上使用普通的索引,或者在(createdate)
上使用更好的索引,这对于大型表很重要(source,createdate)
- 还演示了另一种减去天数的方法。您可以乘以
。相关的:间隔“1天”