Sql 如何验证格式为MMM/DD/YY或MMM/DD/YYYY的日期字段?
我的字段包含字符串值,如2017年7月11日、2017年1月11日。虽然它是一个有效字段,但我无法使用is_date函数验证它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语言选项。您肯定知道以下格式是正确的,对吗 然后,我们可
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'