У меня есть таблица, где дата рождения - 0000-00-00, в формате ГГГГ-ММ-ДД. Я дал задание обновить эти даты до реальных DOB.

DOB может быть извлечен только из идентификационного номера, который выглядит как 950313094353 (не настоящий номер IC), а IC создается как YYMMDDSNRAND, где SN - это номер состояния, например 09 и {{X3 }} - это всего 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
nazhannasir 3 Апр 2019 в 11:34

1 ответ

Лучший ответ

Вам не нужны все эти выборки в подзапросах, обновление - это построчное обновление.

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)
0
P.Salmon 3 Апр 2019 в 09:07