如何基于数字类型LOG_DTM_ID获取上月数据?SQL技术求助
解决思路与方法
方法一:将LOG_DTM_ID转回日期类型处理
把数字型的LOG_DTM_ID转换成日期类型,就能沿用你之前熟悉的日期函数逻辑,避开复杂的数字运算。
示例代码(适配多数SQL方言):
-- 先转字符串再转日期,不同数据库转换函数略有差异 EXTRACT(month FROM CURRENT_DATE)-1 = EXTRACT(month FROM TO_DATE(CAST(LOG_DTM_ID AS VARCHAR), 'YYYYMMDD')) AND EXTRACT(year FROM CURRENT_DATE) = EXTRACT(year FROM TO_DATE(CAST(LOG_DTM_ID AS VARCHAR), 'YYYYMMDD'))
注:MySQL用STR_TO_DATE替代TO_DATE,SQL Server用CONVERT(DATE, CAST(LOG_DTM_ID AS VARCHAR), 112),核心是按YYYYMMDD格式把数字解析为日期。
方法二:直接对LOG_DTM_ID的数字做年月匹配
既然LOG_DTM_ID是YYYYMMDD格式的数字,可直接提取前6位(YYYYMM)来匹配上月的年月值:
- 先计算上月的年月数字(比如当前是2024-05,上月就是202404)
- 提取
LOG_DTM_ID的前6位进行匹配
计算上月年月的代码:
CASE WHEN EXTRACT(month FROM CURRENT_DATE) = 1 THEN (EXTRACT(year FROM CURRENT_DATE)-1)*100 + 12 ELSE EXTRACT(year FROM CURRENT_DATE)*100 + (EXTRACT(month FROM CURRENT_DATE)-1) END AS last_month_ym
匹配LOG_DTM_ID的代码(用整除提取前6位):
LOG_DTM_ID // 100 = CASE WHEN EXTRACT(month FROM CURRENT_DATE) = 1 THEN (EXTRACT(year FROM CURRENT_DATE)-1)*100 + 12 ELSE EXTRACT(year FROM CURRENT_DATE)*100 + (EXTRACT(month FROM CURRENT_DATE)-1) END
额外提示
- 优先选方法一,逻辑直观,能自动处理跨年场景(比如1月的上月是去年12月)
- 用方法二时必须注意跨年边界,避免1月出现匹配错误
内容的提问来源于stack exchange,提问作者ben jjm
相关产品推荐
相关产品推荐

