我有表watchers
:
------------------------------------------
time_type | time_count | timestamp_created
------------------------------------------
'hour' | 1 | 2016-12-08 15:56:26.169614
'hour' | 13 | ...
'day' | 5 | ...
我尝试根据time_type
和time_count
值获取整数:
CREATE OR REPLACE FUNCTION af_calculate_range(tt text,tc integer) RETURNS integer AS $$
SELECT tt, CASE tt WHEN 'day' THEN tc * 60 * 60
WHEN 'hour' THEN tc * 60
END
FROM watchers;
$$
LANGUAGE SQL;
SELECT af_calculate_range(time_type, time_count) FROM watchers
但是我收到了错误:
ERROR: return type mismatch in function declared to return integer
DETAIL: Final statement must return exactly one column.
CONTEXT: SQL function "af_calculate_range"
********** Error **********
用法:
SELECT * FROM watchers
WHERE EXTRACT(EPOCH FROM now()) > (EXTRACT(EPOCH FROM timestamp_created) +
af_calculate_range(time_type, time_count) )
如果time_type
= 'hour'
且time_count
= 1
,则输出应为3600秒。
我的例子出了什么问题:
我使用了https://www.postgresql.org/docs/7.4/static/functions-conditional.html
和https://www.postgresql.org/docs/9.1/static/sql-createfunction.html
答案 0 :(得分:2)
一个函数只能返回一个值,所以你可能打算这样做:
CREATE OR REPLACE FUNCTION af_calculate_range(tt text, tc integer) RETURNS integer AS $$
SELECT CASE WHEN tt = 'day' THEN tc * 60 * 60 -- return a (single) scalar
WHEN tt = 'hour' THEN tc * 60
END
FROM watchers;
$$
LANGUAGE SQL;
但正如@Mureinik指出的那样,你甚至不需要做SELECT
;只需直接使用CASE
表达式。
答案 1 :(得分:2)
您不需要在那里查询,因为您将所有值传递给函数 - 只需返回case
的值:
CREATE OR REPLACE FUNCTION af_calculate_range(tt TEXT, tc INTEGER)
RETURNS INTEGER IMMUTABLE AS $$
BEGIN
RETURN CASE tt WHEN 'day' THEN tc * 60 * 60
WHEN 'hour' THEN tc * 60
END;
END;
$$
LANGUAGE PLPGSQL;
答案 2 :(得分:0)
你太复杂了。存储interval
代替
user_id
现在查询将是:
select now(), now() + interval '2 days';
now | ?column?
-------------------------------+-------------------------------
2016-12-19 05:23:51.856137-02 | 2016-12-21 05:23:51.856137-02
create table watchers (
the_interval interval,
timestamp_created timestamp
);
insert into watchers (the_interval, timestamp_created) values
('1 hour', '2016-12-08 15:56:26.169614');