Как обновить строки, используя вложенные запросы - PullRequest
0 голосов
/ 03 апреля 2019

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

DOB можно извлечь только из Идентификационного номера, который выглядит как 950313094353 (не реальный номер IC), а IC создается как YYMMDDSNRAND, где 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.

1 Ответ

0 голосов
/ 03 апреля 2019

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

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)
...