Databricks Notebook中PostgreSQL查询使用日期参数报错求助
Databricks Notebook日期参数优化方案
错误原因分析
- Databricks中通过
set定义的变量,SQL语句里必须用${变量名}的方式引用,直接写变量名会被识别为表的列,触发"Column不存在"的报错。 - 原代码else分支写法错误,
(p2d1,'-',p2d2)是元组语法,要和then分支统一使用concat函数拼接字符串。 - 原日期值存在逻辑错误:9月没有31号,
2022-09-31是无效日期,会导致数据筛选异常。
修正后的代码
步骤1:定义参数
set p1d1 = '2022-09-01'; set p1d2 = '2022-09-30'; set p2d1 = '2022-10-01'; set p2d2 = '2022-10-31';
步骤2:创建临时视图
create or replace temp view deldet as select case when dyh_date_event::date between ${p1d1} and ${p1d2} then concat(${p1d1},'-',${p1d2}) else concat(${p2d1},'-',${p2d2}) end as periode, * from hivestore.f_delivery_detail where dyh_date_event::date between ${p1d1} and ${p2d2};
进阶简化方案(无需修改代码行)
如果希望仅通过UI操作修改时间段,可使用Databricks笔记本的参数控件功能:
步骤1:添加笔记本参数(Python单元格)
dbutils.widgets.text("start_date", "2022-09-01", "整体查询开始日期") dbutils.widgets.text("end_date", "2022-10-31", "整体查询结束日期") dbutils.widgets.text("period1_start", "2022-09-01", "第一时段开始日期") dbutils.widgets.text("period1_end", "2022-09-30", "第一时段结束日期")
步骤2:引用参数执行SQL
create or replace temp view deldet as select case when dyh_date_event::date between '${period1_start}' and '${period1_end}' then concat('${period1_start}','-','${period1_end}') else concat('${period1_start}','-','${end_date}') end as periode, * from hivestore.f_delivery_detail where dyh_date_event::date between '${start_date}' and '${end_date}';
之后只需在笔记本顶部的参数控件中修改日期,即可完成时间段筛选,无需改动代码。
内容的提问来源于stack exchange,提问作者Yelem
相关产品推荐
相关产品推荐

