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

如何在Teradata中处理出生日期字段并筛选年满18岁的数据?

处理出生日期字段并筛选成年记录的SQL方案

需求说明

现有字段DATE_OF_BIRTH数据类型为varchar(10),存在三种数据格式:

  • 标准日期格式:YYYY/MM/DD
  • 仅年份:YYYY
  • 空值:NULL

需要基于该字段计算年龄,仅保留年龄大于18岁的原字段值,年龄小于等于18岁的记录填充为NULL。

示例输入输出

输入数据

DATE_OF_BIRTH
2000/01/01
2019/03/04
1999/02/18
NULL
1998
NULL
NULL

输出数据

DATE_OF_BIRTH
2000/01/01
NULL
1999/02/18
NULL
1998
NULL
NULL

SQL实现(MySQL版本)

SELECT 
    CASE
        WHEN DATE_OF_BIRTH IS NULL THEN NULL
        ELSE
            CASE
                WHEN TIMESTAMPDIFF(YEAR, 
                                   CASE 
                                       WHEN LENGTH(DATE_OF_BIRTH) = 4 THEN STR_TO_DATE(CONCAT(DATE_OF_BIRTH, '/01/01'), '%Y/%m/%d')
                                       ELSE STR_TO_DATE(DATE_OF_BIRTH, '%Y/%m/%d')
                                   END, 
                                   CURDATE()) > 18 THEN DATE_OF_BIRTH
                ELSE NULL
            END
    END AS DATE_OF_BIRTH
FROM your_table_name;

代码解释

  1. 空值处理:直接返回NULL,不做计算
  2. 日期转换:
    • 仅年份的记录,拼接/01/01后转换为标准日期(默认当年1月1日出生)
    • 标准格式记录直接转换为日期类型
  3. 年龄计算:使用TIMESTAMPDIFF函数精确计算年龄(考虑月份和日期,避免跨年但未到生日的误差)
  4. 结果判断:年龄大于18则保留原字段值,否则返回NULL

SQL实现(PostgreSQL版本)

若使用PostgreSQL,需调整日期转换和年龄计算函数:

SELECT 
    CASE
        WHEN DATE_OF_BIRTH IS NULL THEN NULL
        ELSE
            CASE
                WHEN EXTRACT(YEAR FROM AGE(
                    CASE 
                        WHEN LENGTH(DATE_OF_BIRTH) = 4 THEN TO_DATE(CONCAT(DATE_OF_BIRTH, '-01-01'), 'YYYY-MM-DD')
                        ELSE TO_DATE(DATE_OF_BIRTH, 'YYYY/MM/DD')
                    END, CURRENT_DATE)) > 18 THEN DATE_OF_BIRTH
                ELSE NULL
            END
    END AS DATE_OF_BIRTH
FROM your_table_name;

内容的提问来源于stack exchange,提问作者Shivu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:30:53