跨多版本SQL的合法时间戳提取与数字列筛选通用方案咨询
通用SQL实现:筛选指定日期时间格式+纯数字列的行
针对你的需求,以下是兼容多SQL版本的实现方案,避免依赖regexp_extract这类兼容性较差的函数:
方案1:支持正则匹配的通用写法(推荐)
大部分现代SQL数据库(包括Netezza)都支持REGEXP_LIKE,用正则可以同时完成格式匹配和数值合法性验证,代码简洁且严谨:
SELECT * FROM my_table WHERE -- 验证col_1为YYYY-MM-DD HH:MI:SS格式,同时校验各部分数值范围 REGEXP_LIKE(col_1, '^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$') AND -- 验证col_2非空且仅包含数字 col_2 IS NOT NULL AND REGEXP_LIKE(col_2, '^[0-9]+$');
说明
- 正则表达式不仅匹配字符格式,还确保月份是01-12、日期是01-31、小时是00-23、分钟/秒是00-59,避免格式正确但数值非法的情况(比如
2020-13-01 25:61:61这类无效值)。 - 若使用MySQL,需将
REGEXP_LIKE替换为REGEXP运算符,写法调整为col_1 REGEXP '^[0-9]{4}-...$'。
方案2:无正则支持的老版本兼容写法
如果你的SQL环境不支持正则函数,用字符串函数组合实现完全兼容的验证:
SELECT * FROM my_table WHERE -- 验证col_1的格式和数值合法性 LENGTH(col_1) = 19 AND SUBSTR(col_1, 5, 1) = '-' AND SUBSTR(col_1, 8, 1) = '-' AND SUBSTR(col_1, 11, 1) = ' ' AND SUBSTR(col_1, 14, 1) = ':' AND SUBSTR(col_1, 17, 1) = ':' AND SUBSTR(col_1, 1, 4) BETWEEN '1900' AND '2100' -- 年份范围可按需调整 AND SUBSTR(col_1, 6, 2) BETWEEN '01' AND '12' -- 月份01-12 AND SUBSTR(col_1, 9, 2) BETWEEN '01' AND '31' -- 日期01-31(基础验证) AND SUBSTR(col_1, 12, 2) BETWEEN '00' AND '23' -- 小时00-23 AND SUBSTR(col_1, 15, 2) BETWEEN '00' AND '59' -- 分钟00-59 AND SUBSTR(col_1, 18, 2) BETWEEN '00' AND '59' -- 秒00-59 AND -- 验证col_2非空且仅含数字 col_2 IS NOT NULL AND TRANSLATE(col_2, '0123456789', '') = '';
说明
TRANSLATE函数会将col_2中所有数字字符替换为空,若结果为空则说明原字符串仅包含数字,无其他字符。这个函数在Netezza、Oracle、PostgreSQL等多数SQL环境中都支持。- 日期部分的验证是基础版,若需更精确(比如区分2月天数、30天月份等),可嵌套
CASE逻辑,但会增加代码复杂度,通用场景下基础验证足够。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

