你在这里使用了两种不同的东西。在同时处理DATEFORMAT 和CONVERT(datetime, [value], ###) 时,我对它们的特性并不十分熟悉,但我相信DATEFORMAT 真的只会改变日期字符串文字的处理方式。
“文字”是指日期字符串,您没有向 SQL Server 提供有关如何将其转换为日期的任何提示...见下文...
SET DATEFORMAT mdy
SELECT ConversionLiteral = CONVERT(datetime, '2/3/2022') -- 2022-02-03 00:00:00.000
, ConversionHint = CONVERT(datetime, '2/3/2022', 103) -- 2022-03-02 00:00:00.000
SET DATEFORMAT dmy
SELECT ConversionLiteral = CONVERT(datetime, '2/3/2022') -- 2022-03-02 00:00:00.000
, ConversionHint = CONVERT(datetime, '2/3/2022', 103) -- 2022-03-02 00:00:00.000
当更改DATEFORMAT 并使用CONVERT() 而不指定样式时,它会随着DATEFORMAT 更改而更改。
但是当您在CONVERT() 中指定样式时,我相信您是在告诉SQL Server 忽略DATEFORMAT 设置的内容,而是使用样式103,即dd/mm/yyyy。
这就是为什么无论在上面的示例查询中将DATEFORMAT 设置为什么,ConversionHint 的值都不会改变。
因此,如果您尝试导入格式为dd/mm/yyyy 的字符串,那么使用CONVERT(datetime, [value], 103) 应该会很好。但是如果它试图转换像12/25/2022 这样的东西会抛出一个错误。
我的建议是……如果您能够使用TRY_CONVERT() 功能。然后运行类似:
SELECT *
FROM dbo.MyTable
WHERE TRY_CONVERT(datetime, [value], 103) IS NULL
AND [value] IS NOT NULL
这将显示哪些值无法转换。