如何在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;
代码解释
- 空值处理:直接返回
NULL,不做计算 - 日期转换:
- 仅年份的记录,拼接
/01/01后转换为标准日期(默认当年1月1日出生) - 标准格式记录直接转换为日期类型
- 仅年份的记录,拼接
- 年龄计算:使用
TIMESTAMPDIFF函数精确计算年龄(考虑月份和日期,避免跨年但未到生日的误差) - 结果判断:年龄大于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
相关产品推荐
相关产品推荐

