Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何验证格式为MMM/DD/YY或MMM/DD/YYYY的日期字段?_Sql_Sql Server_Sql Server 2008_Sql Server 2005 - Fatal编程技术网

Sql 如何验证格式为MMM/DD/YY或MMM/DD/YYYY的日期字段?

Sql 如何验证格式为MMM/DD/YY或MMM/DD/YYYY的日期字段?,sql,sql-server,sql-server-2008,sql-server-2005,Sql,Sql Server,Sql Server 2008,Sql Server 2005,我的字段包含字符串值,如2017年7月11日、2017年1月11日。虽然它是一个有效字段,但我无法使用is_date函数验证它 SET DATEFORMAT MDY; if isdate('JUL/11/2017')=1 print 'VALID_DATE' else print 'invalid date' 如果字段值为DD/MMM/YY或DD/MMM/yyy,则可以正常工作。任何人都可以帮助我验证此字段 注意:我也尝试过使用set语言选项。您肯定知道以下格式是正确的,对吗 然后,我们可

我的字段包含字符串值,如2017年7月11日、2017年1月11日。虽然它是一个有效字段,但我无法使用is_date函数验证它

SET DATEFORMAT MDY;  
if isdate('JUL/11/2017')=1
print 'VALID_DATE'
else
print 'invalid date'
如果字段值为DD/MMM/YY或DD/MMM/yyy,则可以正常工作。任何人都可以帮助我验证此字段


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

您肯定知道以下格式是正确的,对吗

然后,我们可以做的是转换MMM/DD/YY和类似的MMM/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
    ,''
);

只需将“/”分隔符替换为空格,即可获得109数据格式:

SET DATEFORMAT MDY;  
if isdate(replace('JUL/11/2017', '/', ' '))=1
print 'VALID_DATE'
else
print 'invalid date'
请尝试以下操作:

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'

您也可以尝试以下方法:

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'

谢谢。

MON/DD/YYYY似乎不是SQL Server支持的转换格式,q.v.。既然SQL Server使用YYYY/MON/DD格式,为什么不使用IfIsDate'2017/JUL/11'=1?此字段是否仅包含字符串格式的日期,还是包含更多文本?如果它只包含一个日期,那么我将花费大量时间将其从varchar转换为datetime类型,因为在将日期存储为varcharacter时会不断遇到问题。实际上,文件包含这些值,因此作为DQ验证和分析的一部分,我正在尝试用各种组合验证日期字段。如果最好的纠正措施是在将日期格式放入数据库之前擦洗/了解日期格式,这感觉像是大刀阔斧。正确,如果我们正在处理批次日期,但正如您所见,OP只处理特定日期的检查。
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'