PROC SQL中筛选datetime20.格式列指定日期数据的方法
解决datetime20.列筛选指定日期数据的方法
首先明确:datetime20.是SAS的显示格式,列的实际存储类型为datetime数值型(代表从1960-01-01 00:00:00到该时刻的秒数),并非字符串,直接用字符串匹配必然失效。以下是几种可行方案:
方法1:用SAS datetime常量匹配日期范围
通过dhms()函数构造目标日期的起始、结束datetime值,筛选当天所有数据:
WHERE your_datetime_column BETWEEN dhms(mdy(7,7,2023), 0, 0, 0) AND dhms(mdy(7,7,2023), 23, 59, 59)
mdy(7,7,2023):生成2023年7月7日的date类型数值dhms(date, hour, minute, second):将date转换为datetime,分别构造当天0点和23:59:59的边界值
方法2:提取日期部分后匹配
用datepart()函数提取datetime列的日期部分,再与目标date常量比较:
WHERE datepart(your_datetime_column) = '07JUL2023'd
若之前用datepart()无效,大概率是错误地将其与纯字符串(无'd'后缀)比较,比如datepart(col) = '07JUL2023'——左边是数值型date值,右边是字符串,类型不匹配导致失败。
也可以用mdy()函数构造date值:
WHERE datepart(your_datetime_column) = mdy(7,7,2023)
方法3:其他SQL环境适配(如SQL Server)
若你的datetime20.是指'07JUL2023 00:00:00'这类字符串格式,可先转换为datetime类型再筛选:
WHERE CAST(your_column AS DATETIME) >= '2023-07-07' AND CAST(your_column AS DATETIME) < '2023-07-08'
或用CONVERT指定格式(SQL Server中格式代码106对应dd MON yyyy):
WHERE CONVERT(DATE, your_column, 106) = '07 Jul 2023'
常见错误排查
- 禁止直接字符串匹配:比如
your_datetime_column = '07JUL2023',datetime列存储的是数值,并非显示的字符串格式,必然匹配失败 - 注意SAS常量后缀:日期需加
'd',datetime需加'dt',比如'07JUL2023:00:00:00'dt是合法的datetime常量 - 核对
mdy()参数顺序:为mdy(month, day, year),不要搞反日、月顺序
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

