#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()
. Что он делает, так это преобразует строку в adate
, что именно то, что вам здесь нужно. Второй аргумент определяет формат входной строки. Смотрите документацию: 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