在使用日期类型参数进行比较大小的时候,务必保证传递的日期类型参数和比较的类型保持一致。
在ETL过程中使用日期类型的参数很是常见,例如SQL如下:
SELECT b.display_name, a.company_id, date_format(max(first_send_notice_date), ‘%Y-%m’) accMonth, count(*) totalReport, sum(CASE WHEN a.takeoff_time > ‘1980’ THEN 1 ELSE 0 END) removed , sum(CASE WHEN a.takeoff_time > ‘1980’ AND a.takeoff_time < a.first_send_notice_date + interval 1 DAY THEN 1 ELSE 0 END) 1DAY , sum(CASE WHEN a.takeoff_time >=a.first_send_notice_date + interval 1 DAY AND a.takeoff_time < a.first_send_notice_date + interval 3 DAY THEN 1 ELSE 0 END) 2_3day , sum(CASE WHEN a.takeoff_time >=a.first_send_notice_date + interval 3 DAY AND a.takeoff_time < a.first_send_notice_date + interval 5 DAY THEN 1 ELSE 0 END) 4_5day , sum(CASE WHEN a.takeoff_time >=a.first_send_notice_date + interval 5 DAY AND a.takeoff_time < a.first_send_notice_date + interval 7 DAY THEN 1 ELSE 0 END) 6_7day, sum(CASE WHEN a.takeoff_time >=a.first_send_notice_date + interval 7 DAY THEN 1 ELSE 0 END) 7DAY, current_timestamp ETL_DTE FROM FACT_matchedVideo a JOIN DIM_trackingWebsite b ON a.trackingWebsite_id = b.trackingWebsite_id WHERE a.first_send_notice_date >= date_format(‘FIRSTDAYOFLASTMONTH′,‘ANDa.firstsendnoticedate{FIRSTDAYOFCURMONTH}’, ‘%Y-%m-%d’) AND a.count_send_notice> 0 AND a.hide_flag = 2 AND b.website_type in(‘ugc’,’hybrid’) GROUP BY 1, 2
其中where过滤条件之一为:
a.first_send_notice_date >= date_format(‘${FIRSTDAYOFLASTMONTH}’, ‘%Y-%m-%d’)
在参数传递过来的时候,kettle的日期参数传递过来的时候,日期格式为:
‘yyyy-MM-dd HH:mm:ss’ 形式为 ‘2015/05/01 00:00:00’
而数据库里面的日期格式为’yyyy-MM-dd HH:mm:ss’
那么两者比较的话就会出错,如下面的错误:
select ‘2015/05/01 00:00:00’ > ‘2015-05-02 00:00:00’; +———————————————–+ | ‘2015/05/01 00:00:00’ > ‘2015-05-02 00:00:00’ | +———————————————–+ | 1 | +———————————————–+