我定义了一个函数,总是给我下周日的日期。它工作正常,这是代码:
CREATE FUNCTION nextSunday() RETURNS date AS $$
DECLARE
dia_semana INT := CAST(EXTRACT(DOW FROM CURRENT_DATE)as INT);
dia INT := 7 - dia_semana;
BEGIN
RETURN current_date + dia;
END;
$$ LANGUAGE plpgsql
我有另一个函数将数据转储到文件中,我需要在里面使用nextSunday()
函数:
CREATE OR REPLACE FUNCTION popularTabelaPessoa() RETURNS VOID AS $$
BEGIN
COPY(SELECT pe.id, pe.fk_naturalidade, pe.fk_documentacao_pessoal, pe.nome,
pe.cpf, pe.data_nascimento, pe.sexo, pe.estado_civil, pe.nome_mae,
pe.data_alteracao, pe.usuario_banco_alteracao,
pe.usuario_aplicacao_alteracao
FROM fluxo_lt.banca ba
INNER JOIN corporativo.localidade lo
ON ba.fk_municipio = lo.id
INNER JOIN fluxo_lt.agendamento_candidato ac
ON ac.fk_banca = ba.id
INNER JOIN info_detran.processo as pr
ON ac.fk_processo = pr.id
INNER JOIN info_detran.candidato as ca
ON pr.fk_candidato = ca.id
INNER JOIN corporativo.pessoa as pe
ON ca.fk_pessoa = pe.id
WHERE ba.data = (SELECT nextSunday())
ORDER BY lo.nome, pe.nome)
TO '/tmp/dump.sql';
END;
$$ LANGUAGE plpgsql
但它不起作用。字段ba.data
为date
,与nextSunday()
函数的返回值类型相同。代码执行时没有任何错误,但文件为空。如果我对日期进行硬编码就可以了。已经尝试过所有内容(转换,将其放入变量,作为函数的参数传递)但到目前为止没有任何工作。
我正在使用Postgres 9.3。
答案 0 :(得分:3)
首先,使用date_trunc()
:
CREATE FUNCTION next_sunday()
RETURNS date AS
$func$
SELECT date_trunc('week', now())::date + 6
$func$ LANGUAGE sql
如果“今天”是星期日,则返回“下周日”。或者,在这种情况下跳过一周:
CREATE FUNCTION next_sunday()
RETURNS date AS
$func$
SELECT date_trunc('week', CURRENT_DATE + 1)::date + 6
$func$ LANGUAGE sql
您可以只使用date_trunc('week', now())::date + 6
而删除功能altogeher。
接下来,简化通话:
CREATE OR REPLACE FUNCTION popular_tabela_pessoa()
RETURNS VOID AS
$func$
BEGIN
COPY(
SELECT pe.id, pe.fk_naturalidade, pe.fk_documentacao_pessoal, pe.nome
,pe.cpf, pe.data_nascimento, pe.sexo, pe.estado_civil, pe.nome_mae
,pe.data_alteracao, pe.usuario_banco_alteracao
,pe.usuario_aplicacao_alteracao
FROM fluxo_lt.banca ba
JOIN corporativo.localidade lo ON ba.fk_municipio = lo.id
JOIN fluxo_lt.agendamento_candidato ac ON ac.fk_banca = ba.id
JOIN info_detran.processo pr ON ac.fk_processo = pr.id
JOIN info_detran.candidato ca ON pr.fk_candidato = ca.id
JOIN corporativo.pessoa pe ON ca.fk_pessoa = pe.id
WHERE ba.data = next_sunday() -- not: (SELECT next_sunday())
-- or: WHERE ba.data = date_trunc('week', now())::date + 6
ORDER BY lo.nome, pe.nome)
TO '/tmp/dump.sql';
END
$func$ LANGUAGE plpgsql
但是,无法解释COPY失败的原因。你确定,你的查询返回任何行?您是否尝试过手册COPY
(没有函数包装器)?