我有一个表格,其中出生日期是0000-00-00,格式为YYYY-MM-DD。我已经完成了将这些日期更新为真实DOB的任务。
只能从看起来像950313094353
(不是真实的IC编号)的标识号中提取DOB,并且像YYMMDDSNRAND
那样创建IC,其中SN
是状态号,例如09和RAND
只是4个随机数,例如4353。
从IC号码中,我可以通过将前6位数字作为子字符串来获取出生日期。
表格
student_st
IC_NO D_BIRTH COUNTRY
------------ ---------- --------
940525053455 0000-00-00 MALAYSIA
IC_NO的数据类型为varchar,D_BIRTH为日期,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号获得的。
答案 0 :(得分:0)
您不需要子查询中的所有选择,更新就是逐行更新。
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)