如何在T-SQL中将dd-mm-yyyy格式转为yyyy-mm-dd并适配ISDATE函数?
解决SQL Server中ISDATE()无法识别dd-mm-yyyy格式的问题
SQL Server的ISDATE()函数对日期格式的识别依赖当前会话的DATEFORMAT设置,默认场景下它仅能识别yyyy-mm-dd或美式日期格式,因此无法处理dd-mm-yyyy格式的字符串。以下是两种可行的解决方法:
方法一:临时设置会话日期格式为dmy
通过SET DATEFORMAT dmy;修改当前会话的日期解析规则,让ISDATE()可以识别dd-mm-yyyy格式的字符串:
SET DATEFORMAT dmy; declare @getdata varchar(max) set @getdata= '[ { "name": "21-01-1998", "type": "Folder" }, { "name": "29-01-1998", "type": "Folder" }, { "name": "299-01-1998", "type": "Folder" }, { "name": "folder1", "type": "Folder" }, { "name": "output", "type": "Folder" } ]' select * from openjson(@getdata) with (foldername varchar(10) '$.name') where ISDATE(foldername) = 1;
执行后会返回前两个符合dd-mm-yyyy规则的有效日期记录,299-01-1998因日期无效会被过滤。
方法二:使用TRY_CONVERT替代ISDATE(推荐)
TRY_CONVERT可以指定日期格式代码(103对应dd/mm/yyyy格式,兼容-分隔符),转换失败时返回NULL,无需修改会话设置,结果更稳定:
declare @getdata varchar(max) set @getdata= '[ { "name": "21-01-1998", "type": "Folder" }, { "name": "29-01-1998", "type": "Folder" }, { "name": "299-01-1998", "type": "Folder" }, { "name": "folder1", "type": "Folder" }, { "name": "output", "type": "Folder" } ]' select * from openjson(@getdata) with (foldername varchar(10) '$.name') where TRY_CONVERT(date, foldername, 103) IS NOT NULL;
此方法直接通过指定格式判断有效性,返回结果与方法一一致,且不受会话日期格式设置影响,更适合通用场景。
内容的提问来源于stack exchange,提问作者Anubhav Swaroop
相关产品推荐
相关产品推荐

