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 ...
随机推荐
- AtCoder Grand Contest 015
传送门 A - A+...+B Problem 题意:n个数最大值a,最小值b,求和的可能数量. #include<cstdio> #include<algorithm> us ...
- poj_1144Network(tarjan求割点)
poj_1144Network(tarjan求割点) 标签: tarjan 割点割边模板 题目链接 Network Time Limit: 1000MS Memory Limit: 10000K To ...
- Spring框架学习笔记(7)——代理对象实现AOP
AOP(面向切面编程) AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming ...
- powerdesign
- python基础2 day3
一.上节回顾 1,while else2,格式化输出name = input('>>>')s1 = '我叫%s,今年%d岁'%(name,18)dic1name = input('& ...
- 审计日志中的AOP
审计跟踪(也称为审核日志)是一个安全相关的时间顺序记录,记录这些记录的目的是为已经影响在任何时候的详细操作,提供程序运行的证明文件记录.源或事件 MVC 自定义一个过滤器 public class A ...
- vuex的使用
vue现在越来越火,不单单可以写简单的小项目,也可以写大中型的项目.但是项目大了,项目之间的数据传递就会变得复杂,那么问题来了?在一个大型项目中,多个组件要公用同一个或多个数据,我们如何保证每个组件获 ...
- Python3 的注释
单行注释 # 这是一个注释 print("Hello, World!") 多行注释 1:3个单引号 ''' 这是多行注释,用三个单引号 这是多行注释,用三个单引号 这是多行注释,用 ...
- Binlog的三个业务应用场景
1.什么是binlog binlog是mysql的一种二进制日志文件,用来记录数据的变化.mysql使用binlog进行主从复制,如图: 客户端向master的mysql sever写入数据 当数据发 ...
- CC2650LaunchPad 运行contiki hello-world示例程序
最近做毕设,开始接触contiki. 下载并运行Instant Contiki 3.0 这是官方制作的虚拟机镜像,直接用vmware等工具就可以运行. 从这里下载. 下载并解压后,用vmware运行. ...