如何使用嵌套查询更新行

How to update rows using nested queries

我有一个 table,其中出生日期为 0000-00-00,格式为 YYYY-MM-DD。我已将这些日期更新为实际 DOB 的任务。

DOB 只能从看起来像 950313094353(不是真正的 IC 号码)的身份证号码中提取,并且 IC 的创建方式类似于 YYMMDDSNRAND,其中 SN 是州号码,例如09 和 RAND 只是 4 个随机数,例如 4353.

从身份证号码,我可以通过减去前 6 位数字得到出生日期。

table

student_st
IC_NO         D_BIRTH     COUNTRY
------------  ----------  --------
940525053455  0000-00-00  MALAYSIA

IC_NO的数据类型是varchar,D_BIRTH是date,COUNTRY是varchar

我试过的代码是

UPDATE `student_st`
SET `D_BIRTH` =  CONCAT('19', (SELECT SUBSTR(`IC_NO`, 1, 2) FROM `student_st` WHERE `COUNTRY`='MALAYSIA'),
                 '-', (SELECT SUBSTR(`IC_NO`, 3, 2) FROM `student_st` WHERE `COUNTRY`='MALAYSIA'),
                 '-', (SELECT SUBSTR(`IC_NO`, 5, 2) FROM `student_st` WHERE `COUNTRY`='MALAYSIA')) 
WHERE `COUNTRY`='MALAYSIA' AND DATE(`D_BIRTH`)='0000-00-00'

这是我遇到的错误

Error in query (1292): Truncated incorrect date value: '0000-00-00'

我不知道为什么会出现这样的错误。

根据我的代码,我预期的结果是 19YY-MM-DD 其中 YY、MM 和 DD 从 IC 号码的子字符串中获得。

您不需要在子查询中进行所有这些选择更新是逐行更新。

drop table if exists t;
create table t
(IC_NO  varchar(20),       D_BIRTH  date, country varchar(20));
insert into t values
(940525053455 , '0000-00-00','malasia'),
(960525053455 , '1995-05-25','malasia'),
(940525053455 , '0000-00-00','aa');

update t
        set d_birth = str_to_date(concat('19',SUBSTR(`IC_NO`, 1, 2),SUBSTR(`IC_NO`, 3, 2) ,SUBSTR(`IC_NO`, 5, 2)),'%Y%m%d')
where country = 'malasia' and d_birth = '0000-00-00'
;

select * from t;

+--------------+------------+---------+
| IC_NO        | D_BIRTH    | country |
+--------------+------------+---------+
| 940525053455 | 1994-05-25 | malasia |
| 960525053455 | 1995-05-25 | malasia |
| 940525053455 | 0000-00-00 | aa      |
+--------------+------------+---------+
3 rows in set (0.00 sec)