无法选择最佳候选功能。您可能需要添加显式类型转换

时间:2017-04-06 04:47:20

标签: postgresql

select
  c_elementvalue.value AS "VALUE",
  c_elementvalue.name AS "NAME",
  rv_fact_acct.postingtype AS "POSTINGTYPE",
  sum(rv_fact_acct.amtacct) AS "AMNT",
  'YTDB' AS "TYPE",
  c_period.enddate AS "ENDDATE",
  max(ad_client.description) AS "COMPANY"
from
  adempiere.c_period,
  adempiere.rv_fact_acct,
  adempiere.c_elementvalue,
  adempiere.ad_client
where
  (rv_fact_acct.ad_client_id =  ad_client.ad_client_id ) and
  (rv_fact_acct.c_period_id = c_period.c_period_id) and
  (rv_fact_acct.account_id = c_elementvalue.c_elementvalue_id) and
  (rv_fact_acct.dateacct BETWEEN  to_date( to_char( '2017-03-01' ,'YYYY') ||'-04-01', 'yyyy-mm-dd')  AND '2017-03-31'  ) AND
  (rv_fact_acct.ad_client_id = 1000000) and
  (rv_fact_acct.c_acctschema_id = 1000000 )and
  (rv_fact_acct.postingtype = 'B')and
  (rv_fact_acct.accounttype in ('R','E') )
group by  c_elementvalue.value , c_elementvalue.name , rv_fact_acct.postingtype , c_period.enddate
order by 5 asc, 1 asc

执行上面的sql语句(postgres)时收到错误消息。

错误讯息:

[Err] ERROR:  function to_char(unknown, unknown) is not unique
LINE 68:  (rv_fact_acct.dateacct BETWEEN  to_date( to_char( '2017-03-...
                                                   ^
HINT:  Could not choose a best candidate function. You might need to add explicit type casts. 

2 个答案:

答案 0 :(得分:1)

这部分查询存在问题:

to_date( to_char( '2017-03-01' ,'YYYY') ||'-04-01', 'yyyy-mm-dd')

没有任何函数to_char,它有第一个参数字符串。

postgres=# \df to_char
                                   List of functions
┌────────────┬─────────┬──────────────────┬───────────────────────────────────┬────────┐
│   Schema   │  Name   │ Result data type │        Argument data types        │  Type  │
╞════════════╪═════════╪══════════════════╪═══════════════════════════════════╪════════╡
│ pg_catalog │ to_char │ text             │ bigint, text                      │ normal │
│ pg_catalog │ to_char │ text             │ double precision, text            │ normal │
│ pg_catalog │ to_char │ text             │ integer, text                     │ normal │
│ pg_catalog │ to_char │ text             │ interval, text                    │ normal │
│ pg_catalog │ to_char │ text             │ numeric, text                     │ normal │
│ pg_catalog │ to_char │ text             │ real, text                        │ normal │
│ pg_catalog │ to_char │ text             │ timestamp without time zone, text │ normal │
│ pg_catalog │ to_char │ text             │ timestamp with time zone, text    │ normal │
└────────────┴─────────┴──────────────────┴───────────────────────────────────┴────────┘
(8 rows)

您可以将字符串2017-03-01投射到date类型。 PostgreSQL无法自行完成,因为有更多变体:numerictimestamp,...

postgres=# select to_date( to_char( '2017-03-01'::date ,'YYYY') ||'-04-01', 'yyyy-mm-dd');
┌────────────┐
│  to_date   │
╞════════════╡
│ 2017-04-01 │
└────────────┘
(1 row)

通常,使用字符串操作进行日期时间操作是错误的。 PostgreSQL(和所有SQL数据库)具有很好的functions日期算术。

例如 - 任务“获得下个月的第一个日期”可以通过表达式完成:

postgres=# select date_trunc('month', current_date + interval '1month')::date;
┌────────────┐
│ date_trunc │
╞════════════╡
│ 2017-05-01 │
└────────────┘
(1 row)

您可以用SQL语言(宏)编写自定义函数:

postgres=# create or replace function next_month(date) 
           returns date as $$
             select date_trunc('month', $1 + interval '1month')::date $$
           language sql;
CREATE FUNCTION
postgres=# select next_month(current_date);
┌────────────┐
│ next_month │
╞════════════╡
│ 2017-05-01 │
└────────────┘
(1 row)

答案 1 :(得分:0)

根据帐户日期,您无法清除要用于过滤的逻辑,但您当前使用to_char()to_date()似乎是导致错误的原因。如果您只想从2017年3月开始获取记录,请使用以下内容:

rv_fact_acct.dateacct BETWEEN '2017-03-01' AND '2017-03-31'

如果您向我们提供有关您要执行的操作的更多信息,可以相应地更新。