Dbeaver提示‘MONTH’列不存在,但未引用该列的技术问题咨询
解决SQL脚本中「'MONTH'列未被识别」的问题
你遇到的错误本质是数据库误将DATEADD函数里的MONTH当成了表的列名,而非时间单位参数。以下是针对性的排查和解决方法:
常见原因及修复方案
1. 数据库要求时间单位参数为字符串
部分数据库(如部分版本的Teradata)要求DATEADD的第一个参数必须是带单引号的字符串。给MONTH加上单引号即可:
--- Check for next months accounting day SELECT * FROM CI_MISSION_CONTROL_DM_PROD_DB.MASTER.MDM_CALENDAR_V1_VW WHERE DAY_DATE BETWEEN DATEADD('MONTH', 1, DATE_TRUNC('MONTH', CURRENT_DATE())) AND DATEADD(DAY, -1, DATEADD('MONTH', 2, DATE_TRUNC('MONTH', CURRENT_DATE()))) AND WORKDAY_DESCRIPTION = 'Accounting Day' AND WORKDAY_NUMBER = 8;
2. 所用数据库的日期函数语法不同
如果是BigQuery、PostgreSQL这类数据库,DATEADD的语法规则有差异,需调整写法:
- BigQuery:使用
DATE_ADD搭配INTERVAL关键字--- Check for next months accounting day SELECT * FROM CI_MISSION_CONTROL_DM_PROD_DB.MASTER.MDM_CALENDAR_V1_VW WHERE DAY_DATE BETWEEN DATE_ADD(DATE_TRUNC(CURRENT_DATE(), MONTH), INTERVAL 1 MONTH) AND DATE_SUB(DATE_ADD(DATE_TRUNC(CURRENT_DATE(), MONTH), INTERVAL 2 MONTH), INTERVAL 1 DAY) AND WORKDAY_DESCRIPTION = 'Accounting Day' AND WORKDAY_NUMBER = 8; - PostgreSQL:直接用时间间隔运算
--- Check for next months accounting day SELECT * FROM CI_MISSION_CONTROL_DM_PROD_DB.MASTER.MDM_CALENDAR_V1_VW WHERE DAY_DATE BETWEEN DATE_TRUNC('month', CURRENT_DATE) + INTERVAL '1 month' AND DATE_TRUNC('month', CURRENT_DATE) + INTERVAL '2 months' - INTERVAL '1 day' AND WORKDAY_DESCRIPTION = 'Accounting Day' AND WORKDAY_NUMBER = 8;
3. 数据库对关键字大小写敏感
部分数据库区分关键字大小写,尝试将MONTH改成小写month:
--- Check for next months accounting day SELECT * FROM CI_MISSION_CONTROL_DM_PROD_DB.MASTER.MDM_CALENDAR_V1_VW WHERE DAY_DATE BETWEEN DATEADD(month, 1, DATE_TRUNC('month', CURRENT_DATE())) AND DATEADD(day, -1, DATEADD(month, 2, DATE_TRUNC('month', CURRENT_DATE()))) AND WORKDAY_DESCRIPTION = 'Accounting Day' AND WORKDAY_NUMBER = 8;
关键提示
先确认你使用的数据库类型,对应调整日期函数的语法,核心是让数据库明确识别MONTH是时间单位参数,而非表列名。
内容的提问来源于stack exchange,提问作者Joe Riebel
相关产品推荐
相关产品推荐

