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的更多相关文章

  1. 【SQL Server】MS SQL Server中的CONVERT日期格式化大全

    CONVERT 函数将某种数据类型的表达式显式转换为另一种数据类型.SQL Server中 将日期格式化. SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式. 在表中,左侧的两列表示将 ...

  2. SQL SERVER中如何格式化日期

    1. SELECT convert(varchar, getdate(), 100) -- mon dd yyyy hh:mmAM (or PM)    -- Oct 2 2008 11:01AM  ...

  3. SQL SERVER中如何格式化日期(转)

    原文地址:http://blog.sina.com.cn/s/blog_95cfa64601018obo.html   1. SELECT convert(varchar, getdate(), 10 ...

  4. 让用户输入一个日期字符串,将其转换成日期格式, 格式是(yyyy/MM/dd,yyyyMMdd,yyyy-MM-dd)中的一种, 任何一种转换成功都可以; 如果所有的都无法转换,输出日期格式非法。

    第三种方法 while(true) {             Date d;        System.out.println("正在进行第一次匹配,请稍后~—~");     ...

  5. SQL Server系统函数:日期函数

    原文:SQL Server系统函数:日期函数 1.返回当前日期和时间 select GETDATE() '当前日期-精确到33毫秒' select GETUTCDATE() 'UTC日期和时间-精确到 ...

  6. Excel日期格式单元格写成yyyy.MM.dd格式将无法读取到DataTable

    最近在改公司的订单系统,遇到了一个奇怪的问题.C#程序需要从Excel文件中将数据全部读取到DataTable,其中Excel文件的第一列是日期格式yyyy/MM/dd,而这一列中大部分的单元格都是按 ...

  7. C# 时间格式 yyyy/mm/dd

    今天遇到个问题在C#中将日期格式设置为yyyy/MM/dd,我是这样写的: DateTime.Now.ToString("yyyy/MM/dd"); 可是获取到的日期还是显示yyy ...

  8. sql server 字符串转成日期格式

    在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...

  9. MS SQL Server中的CONVERT日期格式化大全

    CONVERT 将某种数据类型的表达式显式转换为另一种数据类型.由于某些需求经常用到取日期格式的不同. 现以下可在SQL Server中将日期格式化. SQL Server 支持使用科威特算法的阿拉伯 ...

  10. SQL SERVER 中如何获取日期(一个月的最后一日、一年的第一日等等)

    https://blog.csdn.net/deepwishly/article/details/9101307 这是计算一个月第一天的SQL 脚本:   SELECT DATEADD(mm, DAT ...

随机推荐

  1. python查询完结篇

    0x00 网上找一个查询网站,然后自己写的一个脚本 0x01 代码送上: import requests import time from bs4 import BeautifulSoup strat ...

  2. codeforces 767A Snacktower(模拟)

    A. Snacktower time limit per test:2 seconds memory limit per test:256 megabytes input:standard input ...

  3. [bzoj2462] [BeiJing2011]矩阵模板

    二维的hash.. 注意n的范围是1000........ 真相似乎是全部输出1就行了233 #include<cstdio> #include<iostream> #incl ...

  4. 2016 USP-ICMC-Codeforces-Gym101063C-Sleep Buddies Gym101063F-Bandejao Gym101063J-The Keys

    Gym101063C-Sleep Buddies It is nighttime in the Earth Colony on Mars and everyone is getting ready t ...

  5. 【原创】最新的"答题热"中,前端的一点小工作

    一.前言 据王思聪引爆全民HQ也3个星期了,总结下最新做的一个有关"答题热"的工具.并借由这个工具的开发,分析当下HybridApp中H5的一些技术. 在百万英雄等节目刚出来的时候 ...

  6. ThinkPHP5+小程序商城 网盘视频

    ThinkPHP5+小程序商城   网盘视频  有需要联系我  QQ:1844912514

  7. 【开发技术】refactor 重构----实现文件改名

    当我们要改类名或接口名时,可能会遇到该类(接口)在其它文件中也有使用的情况,如一个个找比较麻烦也容易漏,这里推荐使用右键refactor->rename进行修改.

  8. SSH key introduction

    Preface At the first time, we take the connection with GitLab remote server. You need to type userna ...

  9. css超出内容以省略号显示

    控制只显示2行,并以省略号结束 text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-or ...

  10. Javascript学习--烟花

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...