1、 date()方法
date(dateStr) 格式化日期,非标准格式会返回NULL。
现在有这么一个需求,找出表中时间字段date_str中所有不符合时间格式的数据行,并在备注中说明:
update
table_name
set
mark = case when mark is null then '异常信息:年月异常' else concat(mark, '年月异常') end )
where
LENGTH(date(date_str)) is null;
返回结果
[Err] 1292 - Incorrect datetime value: '20170229'
当数据中有错误的时间,如20170229,上述update语句会执行错误,但是同样的条件执行select则是成功的
select
date_str,date(date_str)
from
table_name
where
LENGTH(date(date_str)) is null;
返回结果
2017-11-01 2017-11-01
2017-11-01 2017-11-01
2017-12-01 2017-12-01
20170229 (NULL)
2018-01-01 2018-01-01
那如何去执行这个update呢,我将where中的判断语句封装起来
DELIMITER |
create function isDate(sln varchar(1024))RETURNS INT
BEGIN
DECLARE tp int;
if(select LENGTH(date(sln)) is null)THEN
set tp = 0;
else set tp =1;
end if;
RETURN tp;
END |
现在封装了一个isDate()的方法,修改update语句如下,则执行成功
update
table_name
set
mark = case when mark is null then '异常信息:年月异常' else concat(mark, '年月异常') end )
where
isDate(date_str)=0;
这是为什么呢?
应该是update语句中不允许带有修改字段值的语句出现,但是封装起来后FUNCTION中不会直接修改值,所以可以执行。
2、 DELIMITER的使用
在上文中创建FUNCTION时,在语句前使用了DELIMITER关键字,该字符定义了一个标记 | ,sql执行时会以该标记作为结束。
在有部分情况下
create function isDate(sln varchar(1024))RETURNS INT
BEGIN
DECLARE tp int;
if(select LENGTH(date(sln)) is null)THEN
set tp = 0;
else set tp =1;
end if;
RETURN tp;
END
> 1064 you have ... near '' 7 line
sql中会以;为结束标记,在end if;处结束执行,并报错,导致不能完整执行,故而定义DELIMITER标记,使其完整执行。
当时在我本机的navicat执行是没问题的,但是发到内网机使用的时候,通过内网机上的Navicat和sql命令行都错了,通过导入sql文件的方式成功。经过一番折腾,增加了DELIMITER | 内容 |,则执行成功。
了解更多参见这位老铁的文章:
https://blog.csdn.net/weixin_33355665/article/details/113323907?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-9.essearch_pc_relevant&spm=1001.2101.3001.4242.6


1049

被折叠的 条评论
为什么被折叠?



