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 ...
随机推荐
- 有关java里,nextLine()无法输入的问题
在课后习题中用到了以下代码 public static void main(String[] args) { System.out.print("输入学生人数:"); int st ...
- django命令(笔记,自己看的)
新建一个项目,名字为mysite:django-admin.py startproject mysite 新建一个应用App,名字为apppython manage.py startapp learn ...
- Vue 组件之 Router
Vue 组件之 Router Vue 开发单页应用的时候,免不了使用Vue组件.在单页应用上如何进行组件切换? 结构如下图所示: 主页面包含Foo组件与Bar组件,在主页面中可以进行Foo与 Bar的 ...
- Python之排序算法:快速排序与冒泡排序
Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...
- 洛谷 P1914 小书童——密码【字符串+模拟】
P1914 小书童——密码 题目背景 某蒟蒻迷上了“小书童”,有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你. 题目描述 蒟蒻虽然忘记密码,但他还记得密码是由一串字母组成.且 ...
- Gym 100952E&&2015 HIAST Collegiate Programming Contest E. Arrange Teams【DFS+剪枝】
E. Arrange Teams time limit per test:2 seconds memory limit per test:64 megabytes input:standard inp ...
- 浅尝辄止WPF自定义用户控件(实现颜色调制器)
主要利用用户控件实现一个自定义的颜色调制控件,实现一个小小的功能,具体实现界面如下. 首先自己新建一个wpf的用户控件类,我就放在我的wpf项目的一个文件夹下面,因为是一个很小的东西,所以就没有用mv ...
- js实现深拷贝和浅拷贝
浅拷贝: 思路----------把父对象的属性,全部拷贝给子对象,实现继承. 问题---------如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,不会开辟新栈,不是 ...
- POJ 1502 MPI Maelstrom(模板题——Floyd算法)
题目: BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distri ...
- Spark算子--coalesce和repartition
coalesce和repartition--Transformation类算子 代码示例