如何编写SQL查询筛选YYYYMMDD格式日期列的当月数据?
筛选当前月份记录的SQL WHERE子句方案
不同数据库的日期函数语法存在差异,下面针对几种常用数据库给出可行的WHERE子句写法:
MySQL/MariaDB
方法1:字符串匹配(直接对比年月前缀)
适合不需要转换日期类型的场景,直接截取Calendar_Day的前6位(YYYYMM格式),和当前年月的格式化字符串对比:
WHERE LEFT(Calendar_Day, 6) = DATE_FORMAT(CURDATE(), '%Y%m')
方法2:日期范围判断(更严谨)
把Calendar_Day转换为日期类型后,判断是否落在当前月份的第一天到次月第一天之间:
WHERE STR_TO_DATE(Calendar_Day, '%Y%m%d') >= DATE_FORMAT(CURDATE(), '%Y-%m-01') AND STR_TO_DATE(Calendar_Day, '%Y%m%d') < DATE_ADD(DATE_FORMAT(CURDATE(), '%Y-%m-01'), INTERVAL 1 MONTH)
SQL Server
方法1:字符串匹配
先将Calendar_Day转为字符串,截取前6位后和当前年月的格式化字符串对比:
WHERE LEFT(CAST(Calendar_Day AS VARCHAR(8)), 6) = FORMAT(GETDATE(), 'yyyyMM')
方法2:日期范围判断
转换为日期类型后,用当月第一天和次月第一天做范围筛选:
WHERE CAST(Calendar_Day AS DATE) >= DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1) AND CAST(Calendar_Day AS DATE) < DATEADD(MONTH, 1, DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1))
Oracle
方法1:字符串匹配
截取Calendar_Day前6位,和当前系统日期的YYYYMM格式字符串对比:
WHERE SUBSTR(Calendar_Day, 1, 6) = TO_CHAR(SYSDATE, 'YYYYMM')
方法2:日期范围判断
转换为日期类型后,用当月起始日和下月起始日做范围判断:
WHERE TO_DATE(Calendar_Day, 'YYYYMMDD') >= TRUNC(SYSDATE, 'MM') AND TO_DATE(Calendar_Day, 'YYYYMMDD') < ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1)
你之前用if、concat报错,大概率是没正确结合日期函数生成符合格式的当前年月字符串。比如手动用concat拼接年月时,要确保月份是两位数(如5月需转为05),而直接用数据库自带的日期格式化函数能避免这类格式错误,写法也更简洁。
内容的提问来源于stack exchange,提问作者laninu
相关产品推荐
相关产品推荐

