Mysql中DELIMITER使用及UPDATE中使用date()方法

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值