JSL中执行SQL语句时转换Timestamp为日期的问题求助
解决JSL中SQL日期转换的问题
看起来你遇到的问题不是JSL不支持CAST函数,而是你的SQL语句存在语法错误,加上可能对数据库日期函数的使用有点小问题。我帮你拆解一下:
首先,修正SQL的语法错误
你原语句里的WHERE子句多写了as Trans_Date,这会导致数据库无法解析SQL——列别名不能用在WHERE条件里,而且这里完全是多余的。这才是导致语句执行失败的核心原因,不是JSL的问题。
两种可行的修正方案
方案1:用数据库原生日期提取函数(推荐)
如果你的后端是DB2(从EDWPROD和WITH UR来看大概率是),直接用DATE()函数提取日期部分会更简洁,兼容性也更好:
Open Database( "DSN=EDWPROD; UID=" || ID || ";PWD=" || PASS || ";MODE=SHARE;DBALIAS=EDWPROD;", "SELECT distinct DATE(TRXN_TS) as Trans_Date FROM pODSCFAView.IMP_DBT_AUTHZN_POST_VW WHERE DATE(TRXN_TS) BETWEEN (current_date - 16 day) AND (current_date - 3 day) WITH UR" );
方案2:修正CAST的语法
如果你坚持要用CAST,只需要去掉WHERE里多余的as Trans_Date即可:
Open Database( "DSN=EDWPROD; UID=" || ID || ";PWD=" || PASS || ";MODE=SHARE;DBALIAS=EDWPROD;", "SELECT distinct Cast(TRXN_TS as date) as Trans_Date FROM pODSCFAView.IMP_DBT_AUTHZN_POST_VW WHERE Cast(TRXN_TS as date) BETWEEN (current_date - 16 day) AND (current_date - 3 day) WITH UR" );
备选方案:在JSL中处理日期
如果数据库端的函数还是有问题,你可以先把完整的datetime数据拉回JMP,再用JSL的函数提取日期部分,这种方法更灵活,不受数据库函数差异影响:
// 先拉取带时间的原始数据 dt = Open Database( "DSN=EDWPROD; UID=" || ID || ";PWD=" || PASS || ";MODE=SHARE;DBALIAS=EDWPROD;", "SELECT distinct TRXN_TS FROM pODSCFAView.IMP_DBT_AUTHZN_POST_VW WHERE TRXN_TS BETWEEN (current_date - 16 day) AND (current_date - 3 day) + 1 day WITH UR" ); // 添加只保留日期的新列 dt << New Column( "Trans_Date", Numeric, Continuous, Format( "m/d/y", 10 ), Formula( Date MDY( Month( :TRXN_TS ), Day( :TRXN_TS ), Year( :TRXN_TS ) ) ) ); // 可选:删除原始的时间列 dt << Delete Columns( :TRXN_TS );
补充说明
JSL本身只是把SQL语句传递给后端数据库执行,所以所谓“JSL不支持CAST”是误解——真正的问题出在SQL语法错误,或者数据库对日期函数的具体要求。你可以先单独在数据库客户端(比如DB2 Command Line Processor)测试SQL语句,确认能运行后再放到JSL里,这样更容易排查问题。
内容的提问来源于stack exchange,提问作者asapfergz08
相关产品推荐
相关产品推荐

