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 :(得分: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无法自行完成,因为有更多变体:numeric
,timestamp
,...
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'
如果您向我们提供有关您要执行的操作的更多信息,可以相应地更新。