Talend中使用TalendDate例程比较日期异常:无法将1753-01-01置为Null
解决Talend同步Snowflake日期字段1753-01-01置空失效问题
在Talend Cloud API Services 7.3.1中同步Snowflake的ODS表到DWH表时,需要将值为1753-01-01的DATE类型字段LETTER_DATE(ODS)置为Null后写入DWH的DT_LETTER字段,但两种尝试的判断逻辑均失效:
- 使用
TalendDate.compareDate()返回1而非0,无法触发Null赋值 - 直接调用
equals()返回false,同样不生效
问题原因
- Talend从Snowflake读取DATE类型字段时,返回的是**
java.sql.Date**对象 TalendDate.parseDate("yyyy-MM-dd", "1753-01-01")返回的是**java.util.Date**对象- 不同日期类型对象直接进行
equals()或TalendDate.compareDate()对比时,会因为类型差异或底层时间戳处理逻辑导致判断结果不符合预期
解决方案
方案1:通过字符串格式化对比(推荐)
将日期字段格式化为统一的字符串格式后进行对比,彻底避免类型差异问题:
TalendDate.formatDate("yyyy-MM-dd", row2.LETTER_DATE).equals("1753-01-01") ? null : row2.LETTER_DATE
方案2:统一日期类型后对比
将TalendDate.parseDate()返回的java.util.Date转换为java.sql.Date,保证两边类型一致:
row2.LETTER_DATE.equals(new java.sql.Date(TalendDate.parseDate("yyyy-MM-dd", "1753-01-01").getTime())) ? null : row2.LETTER_DATE
验证方法
可以在Talend的tLogRow组件中添加以下表达式,查看对比结果:
// 输出字符串格式化后的日期 TalendDate.formatDate("yyyy-MM-dd", row2.LETTER_DATE) // 输出日期对象的类型 row2.LETTER_DATE.getClass().getName() // 输出parseDate返回对象的类型 TalendDate.parseDate("yyyy-MM-dd", "1753-01-01").getClass().getName()
内容的提问来源于stack exchange,提问作者Emile Dadou
相关产品推荐
相关产品推荐

