SQL Server判断是否满足日期格式(YYYYMMDD)以及中文等判断,格式化为YYYY-MM-DD
SQL Server判断是否满足日期格式(YYYYMMDD)以及中文等判断:
在做sql数据的正确性审核中,需要判断数据是否满足日期格式,网上找不到相关的资料,于是自己花了半天写了一个简单的函数
具体思路:
1.判断字符串是否8位
2.如果是8位,通过datalength判断是否8位,如果不是8位,说明字符串中存在汉字或者不可见字符
3.通过Ascii码对8位中的每一位字符进行判断,目的是判断是否数字(按照AsciI码可以避免不可见字符)
4.如果符合上述3中条件,说明字符是8位的数字,判断是否正常日期
ALTER FUNCTION [dbo].[isDataYYYYMMDD]( @Number nvarchar(50))
RETURNS int
AS
begin
if LEN(ltrim(rtrim(@Number)))<>8 or CHARINDEX('.',@Number)>0 or CHARINDEX('#',@Number)>0 or CHARINDEX('*',@Number)>0 or CHARINDEX('-',@Number)>0 or CHARINDEX('\',@Number)>0 or CHARINDEX('/',@Number)>0
begin
return 1
end
else if datalength(ltrim(rtrim(@Number)))<> 8
if ascii(left(@Number,1))> 57 or ascii(left(@Number,1))<48
or ascii(right(left(@Number,2),1))> 57 or ascii(right(left(@Number,2),1))<48
or ascii(right(left(@Number,3),1))> 57 or ascii(right(left(@Number,3),1))<48
or ascii(right(left(@Number,4),1))> 57 or ascii(right(left(@Number,4),1))<48
or ascii(right(left(@Number,5),1))> 57 or ascii(right(left(@Number,5),1))<48
or ascii(right(left(@Number,6),1))> 57 or ascii(right(left(@Number,6),1))<48
or ascii(right(left(@Number,7),1))> 57 or ascii(right(left(@Number,7),1))<48
or ascii(right(left(@Number,8),1))> 57 or ascii(right(left(@Number,8),1))<48
begin
return 1
end
else
begin
return 0
end
else
begin
if DATENAME ( year ,@Number)>2017
begin
return 1
end
else if DATENAME ( month ,@Number)>12 or DATENAME ( month ,@Number)<1
begin
return 1
end
else if DATENAME ( DAY ,@Number)>31 or DATENAME ( DAY ,@Number)<1
begin
return 1
end
end
return 0
end
2.格式化为YYYY-MM-DD
去掉0:20170909:2017-9-9
ALTER FUNCTION [dbo].[formatTime]( @Number nvarchar(500))
RETURNS nvarchar(500)
--返回-1,表示字符串存在问题
--else返回其计算结果
AS
begin
--判断非法字符
if PATINDEX('%[^0123456789]%', @Number)>0
begin
return @Number
end
--如果长度小于4位,eg:2004,200,就直接返回
else if len(@Number)<=4
begin
return @Number
end
--如果长度为5位,eg:20045,返回2004-5
else if len(@Number)=5
begin
if right(@Number,1)='0'
begin
return left(@Number,4)
end
else
begin
return left(@Number,4)+'-'+right(@Number,1)
end
end
--如果长度为6位
else if len(@Number)=6
begin
if right(@Number,2)<='12'
begin
if left(right(@Number,2),1)='0'
begin
return left(@Number,4)+'-'+right(@Number,1)
end
else
begin
return left(@Number,4)+'-'+right(@Number,2)
end
end
else
begin
if right(@Number,1)='0'
begin
return left(@Number,4)+'-'+left(right(@Number,2),1)
end
else
begin
return left(@Number,4)+'-'+left(right(@Number,2),1)+'-'+right(@Number,1)
end
end
end
--如果长度为7位
else if len(@Number)=7
begin
--第5,6位组合起来,小于12 eg:2015111 2015-11-1
if left(right(@Number,3),2)<='12'
begin
if left(right(@Number,3),1)='0' and right(@Number,1)<>'0'
begin
return left(@Number,4)+'-'+left(right(@Number,2),1)+'-'+right(@Number,1)
end
else if left(right(@Number,3),1)='0' and right(@Number,1)='0'
begin
return left(@Number,4)+'-'+left(right(@Number,2),1)
end
else if left(right(@Number,3),1)<>'0' and right(@Number,1)='0'
begin
return left(@Number,4)+'-'+left(right(@Number,3),2)
end
else
begin
return left(@Number,4)+'-'+left(right(@Number,3),2)+'-'+right(@Number,1)
end
end
--第5,6位组合起来大于12,且第6,7位小于31, eg:2015211 2015-2-11
else if left(right(@Number,3),2)>'12' and right(@Number,2)<='31'
begin
if right(@Number,2)='00'
begin
return left(@Number,4)+'-'+left(right(@Number,3),1)
end
else if left(right(@Number,2),1)='0'
begin
return left(@Number,4)+'-'+left(right(@Number,3),1)+'-'+right(@Number,1)
end
end
--第5,6位组合起来大于12,且第6,7位大于31, eg:2015235 不合理
else
return @Number
end
--如果长度为8位
else if len(@Number)=8
begin
if left(right(@Number,4),2)<='12' and right(@Number,2)<='31'
begin
if left(right(@Number,4),2)='00' or right(@Number,2)='00'
begin
return @Number
end
else if left(right(@Number,4),1)='0' and left(right(@Number,2),1)='0'
begin
return left(@Number,4)+'-'+left(right(@Number,3),1)+'-'+right(@Number,1)
end
else if left(right(@Number,4),1)='0' and left(right(@Number,2),1)<>'0'
begin
return left(@Number,4)+'-'+left(right(@Number,3),1)+'-'+right(@Number,2)
end
else if left(right(@Number,4),1)<>'0' and left(right(@Number,2),1)='0'
begin
return left(@Number,4)+'-'+left(right(@Number,4),2)+'-'+right(@Number,1)
end
else
return left(@Number,4)+'-'+left(right(@Number,4),2)+'-'+right(@Number,2)
end
else --不合法
begin
return @Number
end
end
else --不合法
begin
return @Number
end
return '0'
end
不去0:20170909:2017-09-09
ALTER FUNCTION [dbo].[formatTime1]( @Number nvarchar(500))
RETURNS nvarchar(500)
--返回-1,表示字符串存在问题
--else返回其计算结果
AS
begin
--判断非法字符
if PATINDEX('%[^0123456789]%', @Number)>0
begin
return @Number
end
--如果长度小于4位,eg:2004,200,就直接返回
else if len(@Number)<=4
begin
return @Number
end
--如果长度为5位,eg:20045,返回2004-5
else if len(@Number)=5
begin
return left(@Number,4)+'-'+right(@Number,1)
end
--如果长度为6位
else if len(@Number)=6
begin
if right(@Number,2)<='12'
begin
return left(@Number,4)+'-'+right(@Number,2)
end
else
begin
return left(@Number,4)+'-'+left(right(@Number,2),1)+'-'+right(@Number,1)
end
end
--如果长度为7位
else if len(@Number)=7
begin
--第5,6位组合起来,小于12 eg:2015111 2015-11-1
if left(right(@Number,3),2)<='12'
begin
return left(@Number,4)+'-'+left(right(@Number,3),2)+'-'+right(@Number,1)
end
--第5,6位组合起来大于12,且第6,7位小于31, eg:2015211 2015-2-11
else if left(right(@Number,3),2)>'12' and left(@Number,2)<='31'
begin
return left(@Number,4)+'-'+left(right(@Number,3),1)+'-'+right(@Number,2)
end
--第5,6位组合起来大于12,且第6,7位大于31, eg:2015235 不合理
else
return @Number
end
--如果长度为8位
else if len(@Number)=8
begin
if left(right(@Number,4),2)<='12' and right(@Number,2)<='31'
begin
return left(@Number,4)+'-'+left(right(@Number,4),2)+'-'+right(@Number,2)
end
else --不合法
begin
return @Number
end
end
else --不合法
begin
return @Number
end
return '0'
end
SQL Server判断是否满足日期格式(YYYYMMDD)以及中文等判断,格式化为YYYY-MM-DD的更多相关文章
- 【SQL Server】MS SQL Server中的CONVERT日期格式化大全
CONVERT 函数将某种数据类型的表达式显式转换为另一种数据类型.SQL Server中 将日期格式化. SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式. 在表中,左侧的两列表示将 ...
- SQL SERVER中如何格式化日期
1. SELECT convert(varchar, getdate(), 100) -- mon dd yyyy hh:mmAM (or PM) -- Oct 2 2008 11:01AM ...
- SQL SERVER中如何格式化日期(转)
原文地址:http://blog.sina.com.cn/s/blog_95cfa64601018obo.html 1. SELECT convert(varchar, getdate(), 10 ...
- 让用户输入一个日期字符串,将其转换成日期格式, 格式是(yyyy/MM/dd,yyyyMMdd,yyyy-MM-dd)中的一种, 任何一种转换成功都可以; 如果所有的都无法转换,输出日期格式非法。
第三种方法 while(true) { Date d; System.out.println("正在进行第一次匹配,请稍后~—~"); ...
- SQL Server系统函数:日期函数
原文:SQL Server系统函数:日期函数 1.返回当前日期和时间 select GETDATE() '当前日期-精确到33毫秒' select GETUTCDATE() 'UTC日期和时间-精确到 ...
- Excel日期格式单元格写成yyyy.MM.dd格式将无法读取到DataTable
最近在改公司的订单系统,遇到了一个奇怪的问题.C#程序需要从Excel文件中将数据全部读取到DataTable,其中Excel文件的第一列是日期格式yyyy/MM/dd,而这一列中大部分的单元格都是按 ...
- C# 时间格式 yyyy/mm/dd
今天遇到个问题在C#中将日期格式设置为yyyy/MM/dd,我是这样写的: DateTime.Now.ToString("yyyy/MM/dd"); 可是获取到的日期还是显示yyy ...
- sql server 字符串转成日期格式
在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...
- MS SQL Server中的CONVERT日期格式化大全
CONVERT 将某种数据类型的表达式显式转换为另一种数据类型.由于某些需求经常用到取日期格式的不同. 现以下可在SQL Server中将日期格式化. SQL Server 支持使用科威特算法的阿拉伯 ...
- SQL SERVER 中如何获取日期(一个月的最后一日、一年的第一日等等)
https://blog.csdn.net/deepwishly/article/details/9101307 这是计算一个月第一天的SQL 脚本: SELECT DATEADD(mm, DAT ...
随机推荐
- CountDownLatch源码解析
一.CountDownLatch介绍 CountDownLatch是在jdk1.5被引入的,它主要是通过一个计数器来实现的,当在初始化该类的构造函数时,会事先传入一个状态值,之后在执行await方法后 ...
- Java与算法之(7) - 完全二叉树
树 下图是一"棵"树的样子.树这个名称起的很形象,整个数据结构由根.枝.叶组成,其中1为根节点,2.3是1的子节点,4.5.6.8.9.10这几个没有子节点的节点称为叶节点. 节点 ...
- html笔记2
html css的用法 <style type="text/css">代表我要使用css了 <html> <head> <style ty ...
- 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】
CSGO Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- HDU2973(威尔逊定理)
YAPTCHA Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- Asp.Net Core Use MongoDB
前几天在网上想找一下Asp.Net Core使用MongoDB相关的文章,也看了几篇,发现都是在写简单的例子,这样的例子是不能用在生产环境的,不能用的生产环境的.封装一个东西一定是建立在你对这个东西足 ...
- [20160711][VS2012配置OpenCV2.4.9]
相关说明 OpenCV是一套开源机器视觉库,用于简化机器视觉算法的开发与调试. 移植环境 操作系统:Win7 64位 移植软件:Visual Studio 2012 代码下载: https://sou ...
- HDU 1233 还是畅通工程(模板——克鲁斯卡尔算法)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 题意描述: 输入n个城镇以及n*(n-1)/2条道路信息 计算并输出将所有城镇连通或者间接连通 ...
- 算法-java代码实现计数排序
计数排序 第10节 计数排序练习题 对于一个int数组,请编写一个计数排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3], ...
- 记node前后端代码共用的一次坑
项目背景 nodejs项目,webpack打包,用axios请求,Promise封装,nunjucks模板引擎: 之前已将nunjucks模板通过webpack打包策略,做成前后端共用: 目前需要将网 ...