Oracle迁移PostgreSQL遇timestamp without time zone的TRUNC函数报错
解决PostgreSQL中
function trunc(timestamp without time zone) does not exist报错 PostgreSQL没有Oracle中直接对timestamp类型生效的TRUNC()函数,Oracle的TRUNC(timestamp)作用是截断到日期(去除时分秒),在PostgreSQL里可以用以下两种等价方式替代:
方法1:直接转换为date类型
将timestamp字段和参数直接转为date类型,效果和Oracle的TRUNC完全一致:
EXECUTE 'SELECT COUNT(1) FROM BENMAST WHERE BENMAST_ENTITY_CODE = $1 AND BENMAST_CUSTOMER_CODE = $2 AND BENMAST_CR_ON::date = $3::date' INTO W_BEN_ACT_COUNT USING P_ENTITY_CODE, P_CUST_CODE, SYSDATE;
方法2:使用date_trunc()函数
date_trunc('day', timestamp)会返回截断到当天零点的timestamp,和OracleTRUNC的逻辑匹配:
EXECUTE 'SELECT COUNT(1) FROM BENMAST WHERE BENMAST_ENTITY_CODE = $1 AND BENMAST_CUSTOMER_CODE = $2 AND date_trunc(''day'', BENMAST_CR_ON) = date_trunc(''day'', $3)' INTO W_BEN_ACT_COUNT USING P_ENTITY_CODE, P_CUST_CODE, SYSDATE;
注意:动态SQL中的单引号需要用两个单引号转义。
另外,你尝试的clock_timestamp()、current_timestamp()只是获取当前时间的函数,和TRUNC函数不存在的问题无关,所以无法解决报错。
内容的提问来源于stack exchange,提问作者KSMNOP k
相关产品推荐
相关产品推荐

