2017-04-06 51 views
0
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. 
+0

是什么 -

例如任务“获得下个月的第一次约会”可以表达进行您想用来过滤帐户日期的逻辑?你现在的代码没有意义。 –

回答

0

目前尚不清楚你打算通过该帐户使用日期过滤什么逻辑,但你目前使用的to_char()to_date()似乎是错误的原因。如果你只是想从2017年三月抢的记录,那么使用以下命令:

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

如果你给我们介绍一下你正在尝试做的更多信息,可以进行相应的更新。

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-01date类型。 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)