【问题标题】:How to validate date field with format MMM/DD/YY or MMM/DD/YYYY?如何验证格式为 MMM/DD/YY 或 MMM/DD/YYYY 的日期字段?
【发布时间】:2018-04-30 22:04:11
【问题描述】:

我的字段包含字符串值,例如 JUL/11/2017、JAN/11/17。虽然它是一个有效字段,但我无法使用 is_date 函数对其进行验证

SET DATEFORMAT MDY;  
if isdate('JUL/11/2017')=1
print 'VALID_DATE'
else
print 'invalid date'

如果字段值为 DD/MMM/YY 或 DD/MMM/YYYY ,则可以正常工作。任何人都可以帮助我验证这个字段。

注意:我也尝试过使用设置语言选项。

【问题讨论】:

  • MON/DD/YYYY 似乎不是 SQL Server 支持转换的格式,q.v. here.
  • 为什么不使用 if isdate('2017/JUL/11')=1,因为 SQL server 使用格式 YYYY/MON/DD?
  • 此字段是否仅包含字符串格式的日期,还是包含更多文本?如果它只包含一个日期,我会花很多时间将它从 varchar 转换为 datetime 类型,因为在将日期存储为 varchar 时会不断遇到问题
  • 实际上该文件包含这些值,因此作为 DQ 验证和分析的一部分,我正在尝试使用各种组合验证日期字段。

标签: sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

您只需将'/' 分隔符替换为空格即可获得109 种数据格式:

SET DATEFORMAT MDY;  
if isdate(replace('JUL/11/2017', '/', ' '))=1
print 'VALID_DATE'
else
print 'invalid date'

【讨论】:

    【解决方案2】:

    你肯定知道下面的格式是OK吧?

    DD/MMM/YY 
    DD/MMM/YYYY
    

    那么,我们可以做的是像他们一样转换MMM/DD/YYMMM/DD/YYYY格式,并检查日期是否有效:

    DECLARE @Date01 VARCHAR(12) = 'JAN/11/17';
    DECLARE @Date02 VARCHAR(12) = 'JAN/11/2017';
    
    DECLARE @NewDate VARCHAR(12);
    
    DECLARE @xml XML;
    SET @xml = CAST(N'<t>' + REPLACE(@Date01,'/','</t><t>') + '</t>' AS XML);
    
    SELECT STUFF
    (
        (
            SELECT '/' + c.value('.','varchar(MAX)') as item              
            FROM  @xml.nodes('/t') as T(c)
            ORDER BY CASE ROW_NUMBER() OVER(ORDER BY T.c) 
                     WHEN 1 THEN 2
                     WHEN 2 THEN 1
                     WHEN 3 THEN 3
                     END
            FOR XML PATH(''), TYPE
        ).value('.', 'VARCHAR(12)')
        ,1
        ,1
        ,''
    );
    

    【讨论】:

    • 当最好的纠正措施是在将日期格式导入数据库之前清理/了解日期格式时,这感觉就像是大材小用。
    • 正确,如果我们正在处理批量日期,但正如您所见,OP 仅处理特定日期的检查。
    【解决方案3】:

    尝试以下方法:

    DECLARE @Date VARCHAR(20)='JUL/11/2017'
    
    SELECT @Date=STUFF(STUFF(@Date,1,3,RIGHT(LEFT(@Date,6),2)),4,2,LEFT(@Date,3))--,LEFT(@Date,3),RIGHT(LEFT(@Date,6),2)
    
    IF ISDATE(@Date)=1
    print 'VALID_DATE'
    else
    print 'INVALID_DATE'
    

    【讨论】:

      【解决方案4】:

      您也可以尝试以下方法:

      DECLARE @DATE_FIELD VARCHAR(15) = 'JUL/11/2017' --'JAN/11/17'
          IF (ISDATE(REVERSE(LEFT(REVERSE(@DATE_FIELD),CHARINDEX('/',REVERSE(@DATE_FIELD),1)-1))+'-'+ LEFT(@DATE_FIELD,CHARINDEX('/',@DATE_FIELD,1)-1)+'-'+SUBSTRING(@DATE_FIELD,CHARINDEX('/',@DATE_FIELD,1)+1,LEN(@DATE_FIELD)-CHARINDEX('/',@DATE_FIELD,1)-CHARINDEX('/',REVERSE(@DATE_FIELD),1))) = 1)
          PRINT 'VALID_DATE'
          ELSE
          PRINT 'INVALID_DATE'
      

      谢谢。

      【讨论】:

        猜你喜欢
        • 2019-11-28
        • 2021-07-20
        • 1970-01-01
        • 1970-01-01
        • 2018-02-14
        • 2014-10-30
        • 2021-08-17
        • 1970-01-01
        • 2010-10-28
        相关资源
        最近更新 更多