You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:53:30