Actian PSQL v13使用Date_Part按年月筛选数据报错如何解决
问题成因
Actian PSQL v13(前身为Pervasive PSQL)与PostgreSQL是完全独立的两款数据库产品,二者SQL方言不兼容,Actian PSQL不支持PostgreSQL原生的DATE_PART()函数,直接调用会触发表达式解析错误,这是你执行语句报错的根本原因。
你提到的Date、CreateDate字段均为Date类型不存在类型问题,报错和字段本身、传入的'day'/'month'/'year'参数无关,纯粹是目标函数不存在导致的。
正确实现方案
Actian PSQL提供了原生的标量日期函数直接提取年、月、日部分,返回值为整数类型,用法如下:
- 提取年份:调用
YEAR(日期字段),返回4位格式的年份值 - 提取月份:调用
MONTH(日期字段),返回1-12范围的月份值 - 提取日期:调用
DAY(日期字段),返回1-31范围的日期值
原报错语句的修正版本
SELECT MONTH(CreateDate) FROM gl_trx3 WHERE CreateDate = '2021-10-13'
执行后会正确返回该条记录CreateDate对应的月份值10。
按年/月筛选数据的参考写法
筛选指定年份的所有数据:
-- 筛选2021年的所有记录 SELECT * FROM gl_trx3 WHERE YEAR(CreateDate) = 2021
筛选指定年+月的所有数据:
-- 筛选2021年10月的所有记录 SELECT * FROM gl_trx3 WHERE YEAR(CreateDate) = 2021 AND MONTH(CreateDate) = 10
性能优化提示
如果CreateDate字段建有索引,推荐使用日期范围写法替代字段上的函数调用,避免索引失效,写法如下:
-- 筛选2021年10月数据的高性能写法 SELECT * FROM gl_trx3 WHERE CreateDate >= '2021-10-01' AND CreateDate < '2021-11-01'
注意:后续查阅PSQL相关资料时注意区分产品,多数场景下缩写PSQL指代PostgreSQL,和你使用的Actian PSQL语法差异极大,不要直接套用PostgreSQL的函数示例。
内容的提问来源于stack exchange,提问作者Mark Holbert
相关产品推荐
相关产品推荐

