You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨多版本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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 21:43:10