Как обновить запрос Mysql с помощью подзапроса

#mysql #sql #string #datetime #sql-update

#mysql #sql #строка #дата и время #sql-обновление

Вопрос:

У меня есть поле LastScanDate (varchar), и оно мне нужно для обновления ScanDate (DateTime). Подзапрос t2 работает нормально, когда я запускаю его отдельно.

Но когда я пытаюсь использовать его для обновления Scandate, я получаю сообщение об ошибке ‘#1064 — у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом ‘SELECT CONCAT(yr,»-«, m,»-«, d,» «, h,»:»,mit) как recdate from (выберите y’ в строке 6″

 UPDATE test as t1

set t1.ScanDate = recdate

(
SELECT 

CONCAT(yr,"-",m,"-",d," ", h,":",mit) as recdate

from 
(Select
year(STR_TO_DATE(`LastScanDate`, "%m/%d/%Y %H:%i")) AS yr,
MONTH(STR_TO_DATE(`LastScanDate`, "%m/%d/%Y %H:%i")) AS m, 
Day(STR_TO_DATE(`LastScanDate`, "%m/%d/%Y %H:%i")) AS d,
Hour(STR_TO_DATE(`LastScanDate`, "%m/%d/%Y %H:%i")) AS h,
Minute(STR_TO_DATE(`LastScanDate`, "%m/%d/%Y %H:%i")) AS mit,
ID,
ScanDate
FROM test
WHERE ScanDate IS NULL
) as t2
)
where t1.ID = t2.ID
 

Ответ №1:

Ваш запрос действительно выглядит так, как будто вы хотите обновить значения в той же таблице и в той же строке.

Если это так, и предполагая, что ваша строка действительно является датой в формате, соответствующем указанному вами, вы можете просто сделать:

 update test
set scandate = str_to_date(lastscandate, '%m/%d/%Y %H:%i')
where scandate is null
 

Комментарии:

1. Это решение действительно работало, но поскольку я использовал concat, поскольку вы не можете вставить формат даты «%m /%d /%Y %H:%i» в поле DateTime, поскольку DateTime должно быть %Y-%m-%d %H:%i . но я изменил оператор set на оператор concat, и это сработало. Я опубликую код, который сработал.

2. @Eric_DB: Я думаю, вы неправильно понимаете цель str_to_date() . Что он делает, так это преобразует строку в a date , что именно то, что вам здесь нужно. Второй аргумент определяет формат входной строки. Смотрите документацию: dev.mysql.com/doc/refman/8.0/en /…

Ответ №2:

этот код — то, что сработало;

 update test
set ScanDate =

CONCAT
(year(STR_TO_DATE(`LastScanDate`, "%m/%d/%Y %H:%i")),
"-",
MONTH(STR_TO_DATE(`LastScanDate`, "%m/%d/%Y %H:%i")),
"-",
Day(STR_TO_DATE(`LastScanDate`, "%m/%d/%Y %H:%i")),
" ",
if (right(LastScanDate,2) = "PM", Hour(STR_TO_DATE(`LastScanDate`, "%m/%d/%Y %H:%i")) 12,Hour(STR_TO_DATE(`LastScanDate`, "%m/%d/%Y %H:%i"))),
":",
Minute(STR_TO_DATE(`LastScanDate`, "%m/%d/%Y %H:%i"))
)

where ScanDate is null